本文介绍 Python 中 Module 和 Package 的区别和关系。
Python Module
Module 是最小的模块单元,可以是一个 Python 文件(.py
),也可以是一个其他语言(例如 C 语言)编写编译的模块,也可以是解析器自带的内置模块(例如 itertools
模块)
导入 Module 的方式也很直白:
import <module_name>
Python 解释器查找 Module 的路径为 sys.path
,通常包含当前工作目录。
当 Module 被导入时,其中的代码将被执行。如果该模块也可以作为单脚本执行,这部分代码应该用 if __name__ == "__main__":
包裹起来,避免在导入模块时被执行。
当 Module 被多次导入时,其代码只执行一次。可以通过 importlib
来重新导入 Module。
import importlib
importlib.reload(<module_name>)
Python Package
多个 Module 以层级关系组织在一起,就构成了 Package。一般来说,Package 是一个包含很多 Module 的文件夹。
例如,当 Package 的结构如下时:
📂pkg
├──📃mod1.py
└──📃mod2.py
可以通过以下方式导入 pkg
中的 Module:
import pkg.mod1
from pkg import mod2
但是,下面这种方式却会报错:
import pkg
# do something with pkg.mod1, eg:
print(pkg.mod1) # AttributeError: module 'pkg' has no attribute 'mod1'
这种情况可以借助 Package 文件夹中 __init__.py
解决,当 Package 或其中的 Module 被导入时, __init__.py
会被执行,因此可以在其中实现 Package 的初始化等操作。
例如,在 __init__.py
中写入:
from . import mod1, mod2
此时,通过之前 pkg.mod1
这种方式调用模块就不会报错了。