如何编写一个 python 模块

自己写的一些 python 小工具想要保存一下,然后在需要的时候可以方便调用,所以
了解了一下 python 模块的编写,这里记录一下。

一个文件就是一个模块

实际上,一个 python 源文件就是一个模块,并不需要什么特殊的操作,需要注意的
就是程序怎么找到这个模块。如果模块放在了sys.path所指定的位置,那么就可以
被找到。比如在我的机器上:

1
2
3
4
5
6
7
8
9
10
>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['',
'/usr/lib/python35.zip',
'/usr/lib/python3.5',
'/usr/lib/python3.5/plat-x86_64-linux-gnu',
'/usr/lib/python3.5/lib-dynload',
'/usr/local/lib/python3.5/dist-packages',
'/usr/lib/python3/dist-packages']

其中第一个是空的,表示的是当前文件夹。

简单例子

execute.py:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
import subprocess
import sys

def execute(command_list):
subprocess.call(command_list)

def main():
execute(sys.argv[1:])

if __name__ == "__main__":
main()

test_execute.py:

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python3

import execute

def main():
execute.execute(["ls"])

if __name__ == "__main__":
main()

运行一下:

1
2
3
$ chmod +x test_execute.py
$ ./test_execute.py
execute.py test_execute.py

运行成功,没有问题。

更进一步:包

为了方便管理,建一个包(package)把文件(即模块)放在里面。一个包里可以有多个
模块。建一个包也很方便,新建一个目录即可,目录里面新建一个名为
__init__.py的文件,不必有内容,空文件即可,这样该目录下的其他 .py 文件就
可以作为模块被引用。目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
$ tree mypackage
mypackage
├── execute.py
├── __init__.py
├── __main__.py
└── __pycache__
├── execute.cpython-35.pyc
├── __init__.cpython-35.pyc
└── __main__.cpython-35.pyc

1 directory, 6 files

其中__pycache__是预编译过的文件,可以加快执行速度。__main__.py的作用是
让这个包可以像下面这样执行:

1
2
$ python mypackage ls
execute.py mypackage __pycache__ test_execute.py

main.py的内容为:

1
2
3
4
5
6
#!/usr/bin/env python3

import execute
import sys

execute.execute(sys.argv[1:])

现在要引用包里的execute模块就可以这样:

test_import_package.py:

1
2
3
4
5
6
7
8
#!/usr/bin/env python3
import mypackage.execute

def main():
mypackage.execute.execute(["ls"])

if __name__ == "__main__":
main()

运行结果如下:

1
2
$ ./test_import_package.py 
execute.py mypackage __pycache__ test_execute.py test_import_package.py

References

《零基础学python》(第二版) » 第六章 模块 » 编写模块

0%