基础概念
- 模块是Python组织代码的基本方式
- 一个Python脚本可以单独运行,也可以导入到另一个脚本中运行,当脚本被导入运行时,我们将其称为模块(module)
- 所有的.py文件都可以作为一个模块导入
特点
- 模块名与脚本的文件名相同
例如写一个hello.py的脚本,则可以在另一个脚本中用import hello语句来导入它
- Python的模块可以按目录组织为包
创建1个包的步骤:
- 创建一个名字为包名的目录
- 在该目录下创建一个__init__.py文件
- 根据需要,在该目录下存放脚本文件或已编译的扩展及子包
- import pack.m1,pack.m2,pack.m3
扩展
- Python内置模块的位置存放在(sys.path环境变量中,类似shell中的PATH)
主要的模块安装在/usr/lib64/python 2.x/下(python-libs包安装的)
- 自定义Python的模块path
1、导入sys包,利用append把路径加入path中
sys.path.append('/tmp')
2、修改系统变量
vim ~/.bashrc
export PYTHONPATH=/tmp
例子
写一个类似wc命令的脚本
#!/usr/bin/env python
def PrintInfo(content):
chars = len(content)
words = len(content.split())
lines = len(content.split('
'))
print chars,words,lines
string = open('/etc/passwd').read()
PrintInfo(string)
与wc命令对比后发现多了一行,原因是,我们统计行的时候用
作为分隔符,虽然是三行,三个
,那么用
分割后,就为4行了。
改进版:
#!/usr/bin/env python
def PrintInfo(content):
chars = len(content)
words = len(content.split())
lines = content.count('
')
print chars,words,lines
string = open('/etc/passwd').read()
PrintInfo(string)
这里只需要对 出现的次数做统计即可。
脚本调用
cat 2.py
#!/usr/bin/env python
import wc
那么执行2.py就可以去调用wc.py(当前目录下,没有的话才会去PYTHONPATH中查找),调用完毕后会生成wc.pyc文件,方便下次调用,注意模块名和变量名定义规则相同,不能以数字开头
如果要调用wc中的PrintInfo模块来处理字符
cat 2.py #!/usr/bin/env python import wc s = '''hello world you are superman are you are ''' wc.PrintInfo(s)
问题:这样的话,在执行2.py的时候,它也会去执行wc.py,那么同时会去输出wc.py的信息,为了避免这种情况,这里引入python内置变量__name__
则修改后的wc.py为:
#!/usr/bin/env python def PrintInfo(content): chars = len(content) words = len(content.split()) lines = content.count(' ') print chars,words,lines if __name__ == '__main__': string = open('/etc/passwd').read() PrintInfo(string)
注意:__name__是python内置的函数,作用是返回此脚本的执行状态,直接执行此脚本,则__name__返回的是__main__,如果通过其他模块调用,那么返回的是模块名称,所以这里做个判断,如果是调用则不输出原脚本的内容,如果是直接执行此脚本则输出后面的语句。
打包
包是一些按目录组织的模块的集合
在要打包的目录下创建__init__.py文件,这个文件可以是空的(也可以是包的描述),那么包的名字就是目录的名称,使用的话:from day4 import wc 或者 import day4.wc
如果只是导入函数,那么使用 from day4.wc import PrintInfo
在导入的时候还可以给包/函数起个别名 import day4.wc as Test
注意:导入包的时候,默认它会在当前目录下或者在PYTHONPATH中寻找