Python 的import
机制(通常称为导入机制)基于Finders 和 Loaders。当您使用 import 语句导入模块时,一系列查找器会尝试查找您正在导入的模块。您可以查看按顺序触发的所有查找器的列表:
>>> import sys
>>> sys.meta_path
[<class '_frozen_importlib.BuiltinImporter'>,
<class '_frozen_importlib.FrozenImporter'>,
<class '_frozen_importlib_external.PathFinder'>]
如果没有一个查找器能够解析该模块,则ModuleNotFoundError
引发。
BuiltinImporter
解析预加载到解释器中的 sys、time、gc 等模块。FrozenImporter
解决冻结的模块。PathFinder
通过遍历中的路径来解析模块sys.path
。
打印sys.path
显示您的当前目录是第一个条目,因此首先搜索匹配项。
这是一个简单的序列,您可以使用它来推断导入将从何处发生:
- 是内置模块的模块部分。示例:
import sys
。即使你的当前目录中有一个名为 sys.py 的文件,由于BuiltinImporter
首先被调用,它会解析内置的 sys 模块。
- 模块是否存在于您的当前目录中,因为这是
sys.path
.
- 该模块是作为核心 python 或站点包的一部分提供的吗?
由 PathFinder 导入的模块(存在于 sys.path 中的模块)将具有__path__
一个属性,您可以检查它的位置。
也可以重新排序 sys.meta_path 中的查找器,甚至添加您自己的自定义查找器和加载器,让您完全控制和创造性地修改默认机器。可以注册自定义查找器和加载器以查找系统中其他地方的模块,甚至可以从外部系统动态查找模块。