Python之包的相关
包的产生:
- 由于模块不断更新,越写越大,仅用单个py文件会使模块逻辑不够清晰,所以需要将模块的不同功能放入不同的py文件,然后将所有py文件放在一个目录内,这个目录就是包
- 包就是一个包含用__init__.py文件的目录
包的使用:
- 包的本质是模块的一种形式,包是用来被当做模块导入,而不是用来直接运行
- 导入包本质是导入包内的__init__.py文件
import package
# Python2导入包,若包里没有__init__.py文件会报错
# Python3导入包,若包里没有__init__.py文件不会报错
包的导入:
- 首先有如下文件结构
'''
test_dir/
-pkg1
-__init__.py
-p1_m1.py
-f1()
-p1_m2.py
-f2()
-pkg2
-__init__.py
-p2_m1.py
-f3()
-p2_m2.py
-f4()
-demo.py
'''
-
在demo.py内使用函数f1
-
方式一:
import pkg1.p1_m1
pkg1.p1_m1.f1()
# 使用过于啰嗦,可以起别名
import pkg1.p1_m1 as m1
m1.f1()
- 方式二:
# 直接从包内导入文件
from pkg1 import p1_m1
p1_m1.f1()
# 也可直接导入f1
from pkg1.p1_m1 import f1
f1()
注:对使用者来说,包的导入和单个模块的导入应该方式相同,若使用者导入包失败,应考虑包是否在sys.path列表中。
-
from ...impot 的from 后面可以带多个点. 点的左侧只能是包的名字。
-
from...import 的import后面只能接py文件或文件内的方法
不能带点.
from pkg1 import p1_m1.f1
p1_m1.f1()
# 语法错误
若要让使用者对包的导入不会发生变化(当作单个模块导入),需要在包内的__init__.py文件内导入其他的模块
-
绝对导入:
-
以包作为顶级目录来导入
# pkg1/__init__.py文件内 from pkg1.p1_m1 import f1 from pkg1.p1_m2 import f2 from pkg2.p2_m1 import f3
-
点的左侧必须是包
-
-
相对导入
- 仅限于包内使用,不能跨出包
- . :表示当前目录
- .. :表示上一级目录
# pkg1/__init__.py文件内
from .
注:包内之间的导入推荐使用相对导入
-
在__init.py__内使用from ... import ... 导入包内的其他模块时,无法直接在init.py文件内运行,只能被其他文件用来导入
-
在init.py文件内不能使用import p1_m1导入包内的其他文件,这样虽然可以直接在init.py文件内运行导入的模块,但当包被其他文件导入时,由于sys.path环境变量原因,包无法使用。