python模块

模块说明

模块是python组织代码的基本方式。
一个python脚本可以单独运行,也可以导入到另外一个脚本中运行,当脚本被导入运行时,我们称之为模块。

所有的.py文件都可以作为一个模块导入。
模块名与脚本的文件名相同。

1
hello.py    import hello

python模块可以按照目录组织为包。

创建包的步骤

  1. 创建一个名字为包的目录。
  2. 在该目录下创建一个init.py文件。
  3. 根据需要在该目录下存放脚本文件或已编译的扩展及子包。
    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
    4
    In [3]: from advance import wordCount

    In [4]: wordCount.wordCount('hello Word\n')
    1 2 11
  • 方法2

    1
    2
    3
    4
    In [5]: import advance.wordCount

    In [6]: advance.wordCount.wordCount('hello Word\n')
    1 2 11
  • 方法3

    1
    2
    3
    4
    In [7]: from advance.wordCount import wordCount

    In [8]: wordCount('hello Word\n')
    1 2 11
  • 方法4

    1
    2
    3
    4
    In [9]: from advance import wordCount

    In [10]: wordCount.wordCount('hello Word\n')
    1 2 11
  • 方法5

    1
    2
    3
    4
    In [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
17
In [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

备注

  1. 使用import引用模块时,模块名称不能为纯数字,建议使用有意义的名称;
  2. 使用import引用模块时,被引用模块会出现.pyc,编译之后的文件;目的是为了加快执行速度和效率;
  3. 统计行数时,假如字符串结尾有换行符\n,可能出现统计不准确的情况;
    1
    2
    3
    4
    In [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
6
In [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
2
In [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
2
28 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

Recommended Posts