模块说明
模块是python组织代码的基本方式。
一个python脚本可以单独运行,也可以导入到另外一个脚本中运行,当脚本被导入运行时,我们称之为模块。
所有的.py文件都可以作为一个模块导入。
模块名与脚本的文件名相同。1
hello.py import hello
包
python模块可以按照目录组织为包。
创建包的步骤
- 创建一个名字为包的目录。
- 在该目录下创建一个init.py文件。
- 根据需要在该目录下存放脚本文件或已编译的扩展及子包。
1
import pack.m1,pack.m2,pack.m3
实例
当前目录1
2
3
4
5[root@linux02 advance]# ls
1_1_1.py 1_2_1.py 1_3_1.py 1_4_2.py 1_5_1_1.py 1_5_2_1.py 1_8_3_1.py wordCount.py
1_1_3.py 1_2_2.py 1_4_1.py 1_4_4.py 1_5_1.py 1_5_2.py 1_8_3.py wordCount.pyc
[root@linux02 advance]# pwd
/root/aming/advance
首先创建init.py文件。1
[root@linux02 advance]# touch __init__.py
包的名称就是上级目录的名称,此处为advance。
下面的第一个wordCount表示wordCount.py文件,第二个wordCount表示wordCount.py中的函数名。
使用方法如下
方法1
1
2
3
4In [3]: from advance import wordCount
In [4]: wordCount.wordCount('hello Word\n')
1 2 11方法2
1
2
3
4In [5]: import advance.wordCount
In [6]: advance.wordCount.wordCount('hello Word\n')
1 2 11方法3
1
2
3
4In [7]: from advance.wordCount import wordCount
In [8]: wordCount('hello Word\n')
1 2 11方法4
1
2
3
4In [9]: from advance import wordCount
In [10]: wordCount.wordCount('hello Word\n')
1 2 11方法5
1
2
3
4In [12]: from advance.wordCount import wordCount as wc
In [13]: wc('hello Word\n')
1 2 11
备注:使用前需要将当前路径引入python中的sys.path,具体操作方法将下面的路径修改。
模块位置
sys.path
修改python的路径
方法1:
1
sys.path.append(‘/root/aming’)
方法2:编辑/root/.bashrc,新增
1
export PYTHONPATH=/root/aming
执行使之生效./root/.bashrc
或者source /root/.bashrc
。
确认sys.path是否正确被引入。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17In [1]: import sys
In [2]: sys.path
Out[2]:
['',
'/usr/bin',
'/root/aming',
'/usr/lib64/python26.zip',
'/usr/lib64/python2.6',
'/usr/lib64/python2.6/plat-linux2',
'/usr/lib64/python2.6/lib-tk',
'/usr/lib64/python2.6/lib-old',
'/usr/lib64/python2.6/lib-dynload',
'/usr/lib64/python2.6/site-packages',
'/usr/lib64/python2.6/site-packages/gtk-2.0',
'/usr/lib/python2.6/site-packages',
'/usr/lib/python2.6/site-packages/IPython/extensions']
实例
统计文件字符数、单词数、行数1
2
3
4
5
6
7
8
9
10#!/usr/bin/python
def wordCount(s):
chars = len(s)
words = len(s.split())
lines = s.count('\n')
print lines,words,chars
s = open('/etc/passwd').read()
wordCount(s)
执行结果1
28 46 1322
当引用模块时1
2
3[root@linux02 advance]# cat 1_8_3_1.py
import wordCount
执行结果1
2[root@linux02 advance]# python 1_8_3_1.py
28 46 1322
备注
- 使用import引用模块时,模块名称不能为纯数字,建议使用有意义的名称;
- 使用import引用模块时,被引用模块会出现.pyc,编译之后的文件;目的是为了加快执行速度和效率;
- 统计行数时,假如字符串结尾有换行符\n,可能出现统计不准确的情况;
1
2
3
4In [165]: s = open('/etc/hosts').read()
In [170]: s
Out[170]: '127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4\n::1 localhost localhost.localdomain localhost6 localhost6.localdomain6\n127.0.0.1 linux02\n'
结尾有换行符\n,最后一个字符为空,统计行数不准确。1
2
3
4
5
6In [169]: s.split('\n')
Out[169]:
['127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4',
'::1 localhost localhost.localdomain localhost6 localhost6.localdomain6',
'127.0.0.1 linux02',
'']
建议使用方法1
2In [172]: s.count('\n')
Out[172]: 3
改进
wordCount.py
被引用之后1
2
3
4
5
6[root@linux02 advance]# cat 1_8_3_1.py
import wordCount
s = """hello World
superman"""
wordCount.wordCount(s)
执行结果1
228 46 1322
1 3 20
如何在不改变wordCount.py的执行结果情况下,在1_8_3_1.py中只输出第二行结果呢?1
2
3
4
5
6
7
8
9
10
11
12[root@linux02 advance]# cat wordCount.py
#!/usr/bin/python
def wordCount(s):
chars = len(s)
words = len(s.split())
lines = s.count('\n')
print lines,words,chars
if __name__ == '__main__':
s = open('/etc/passwd').read()
wordCount(s)
执行结果1
2[root@linux02 advance]# python 1_8_3_1.py
1 3 20
备注:__name__
为python内置变量,特点为当自身脚本执行时,输出结果为__main__
。1
2
3[root@linux02 advance]# python wordCount.py
__main__
28 46 1322
当被引用执行时,输出结果为脚本名称1
2
3[root@linux02 advance]# python 1_8_3_1.py
wordCount
1 3 20