目录
Python中 包(package) 与 模块(module) 的概念
一. Python中, 包 (package) 与 模块 (module) 的概念
1. 一个有 __init__.py
文件 的目录, 被视为一个 Python 的 包 (package)
一个包可以有多个模块(Python源文件), 即包所在目录下可以有多个Python源文件, 每个Python源文件都是一个Python模块
2. 一个Python源文件 , 被视为一个模块 (module)
二. 不同包之间 以及 同一个包的不同模块之间的导入问题
正确导入方式:
- 同目录下的不同包之间的导入方式:
import <pkg> 或: from <pkg> import <module> 或: from <pkg>.<module> import <*> | <export-item>
- 同一个包的不同模块之间的导入
# 导入同级目录其他模块: from .<other_module> import <*> | <export-item> # 导入上级目录中的模块: from ..<other_module> import <*> | <export-item> # 导入下级目录中的模块: from <directory>.<other_module> import <*> | <export-item>
注意:
- 不能使用使用
来导入同级目录下的其他package;import .xxx 或 import ..xxx 或 from .xxx import yyy 或 from ..xxx import yyy
- 同一个package不同module 之间, 不能用
import xxx
的方式导入, 只能用from xxx import yyy
的方式导入
1. 同级目录下不同包之间的导入问题
# 1. 同级目录下的package之间, 可以使用下列方式进行导入:
# 下面是项目的目录结构:
WorkDirectory/ # 项目根目录 (也是python命令运行的工作目录)
| main.py # 测试文件, 程序执行入口所在文件
|
+---pkg1 # 模块一
| a.py
| __init__.py
|
\---pkg2 # 模块二
b.py
__init__.py
# 执行:
# 1. cd 到WorkDirectory目录
# 2. 执行: python .\main.py
###################################################################
b.py 文件源码:
def b_method():
print('this is pkg2 (package), module b')
a.py 文件源码:
# import pkg2.b
# from pkg2 import b
from pkg2.b import b_method
def a_method():
print('this is pkg1 (package), module a')
# pkg2.b.b_method() # 对应: import pkg2.b
# b.b_method() # 对应: from pkg2 import b
b_method() # 对应: from pkg2.b import b_method
main.py 文件源码:
# import pkg1.a
# from pkg1 import a
from pkg1.a import a_method
if __name__ == "__main__":
# pkg1.a.a_method() # 对应: import pkg1.a
# a.a_method() # 对应: from pkg1 import a
a_method() # 对应: from pkg1.a import a_metho
2. 同一个包的不同模块之间的导入问题
# 2. 同一个package内部不同模块之间的导入
# 下面是项目的目录结构:
WorkDirectory/ # 项目根目录 (也是python命令运行的工作目录)
│ main.py #
│
└─module1
a.py
b.py
__init__.py
# 执行:
# 1. cd 到WorkDirectory目录
# 2. 执行: python .\main.py
######################################################################
b.py 源文件代码:
def b_method():
print('this is module b, method b_method()')
a.py 源文件代码:
from .b import b_method
# from b import b_method # ModuleNotFoundError: No module named 'b'
def a_method():
print('this is module a, method a_method()')
b_method()
main.py 源文件代码:
# import module1.a
from module1.a import a_method
if __name__ == "__main__":
# module1.a.a_method() # 对应: import module1.a
a_method() # 对应: from module1.a import a_method