Python import 的搜索路径
1. 在当前目录下搜索该模块
2. 在环境变量 PYTHONPATH 中指定的路径列表中依次搜索
3. 在 Python 安装路径的 lib 库中搜索
包:
为避免模块名冲突,Python引入了按目录组织模块的方法,称之为包(package)
当一个文件夹下有__init__.py时,意为该文件夹是一个包(package),其下的多个模块(module)构成一个整体,而这些模块(module)都可通过同一个包(package)导入其他代码中。
Python3 中:包可以通过__init__.py 指定模块;有没有__init__.py没有太大区别,文件夹会自动当作包
Python2 中:包可以通过__init__.py 指定模块;包必须有__init__.py,否则导入时会报错
__init__.py文件用于组织包,方便管理各个模块之间的引用、控制着包的导入行为。
from pacakge_1 import * 这种形式的写法,需在__init__.py中加上:
__all__ = ['file_a', 'file_b']
package_1下有file_a.py和file_b.py,在导入时__init__.py文件将被执行。
绝对导入和相对导入
绝对导入:
import A.B 或 from A import B
相对导入:
from . import B 或 from ..A import B,
.代表当前模块,..代表上层模块,...代表上上层模块,依次类推。
优点:
相对导入可以避免硬编码带来的维护问题,例如我们改了某一顶层包的名,那么其子包所有的导入就都不能用了。
缺点:
存在相对导入语句的模块,不能直接运行,否则会有异常:
ValueError: Attempted relative import in non-package
顶层模块:
在没有明确指定包结构的情况下,Python 是根据 __name__ 来决定一个模块在包中的结构的,如果是__main__ 则它本身是顶层模块,没有包结构。
如果是A.B.C 结构,那么顶层模块是A。
基本上遵循这样的原则: 如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块