Python 模块查找器介绍

我被代码海扁署名-非商业-禁演绎
阅读 3:15·字数 978·发布 
Bilibili 空间
关注 960

本节所讲述的 Python 模块查找器,同样适用于包,因为包是特殊的模块。

Python 模块查找器

模块查找器作为 Python 导入系统的一部份,其对应的英文为 Module Finders,他的作用是查找定位需要载入的模块。这通常发生在import语句执行时,模块查找器可能会被启动并返回相关模块的信息,以便进行下一步的载入操作,如果模块查找器未找到所需模块,那么将导致异常ModuleNotFoundError

Python 模块查找器何时工作?

只有当模块缓存中没有需要载入的 Python 模块时,模块查找器才会运行并定位模块,请留意这一点,他说明模块查找器并不需要确定模块是否存在缓存,这项工作在启动查找器之前已经完成。如果你希望编写自己的 Python 模块查找器,那么不必在缓存上浪费时间。

模块

想要了解模块缓存,你可以查看Python 模块缓存一段。

Python 模块查找器种类

Python 模块查找器可以分为元路径查找器(Meta Path Finder)和路径条目查找器(Path Entry Finder),其中路径条目查找器具体实现了基于路径定位 Python 脚本的功能,比如,定位模块Dog对应的脚本文件。

事实上,元路径查找器和路径条目查找器均不止一个,他们被保存在两个不同的 Python 列表对象中。

Python 路径条目查找器隶属于 Python 元路径查找器

需要指出,路径条目查找器只是服务于元路径查找器PathFinder,如果我们将该查找器删除,那么路径条目查找器将不会发挥作用,对应的 Python 脚本也将无法载入。

在文件finders.py中,我们使用import语句导入了位于同一目录的apple模块。由于在此之前PathFinder元路径查找器被删除,因此导入apple将导致异常ModuleNotFoundError

finders.py
# 尝试找到名称包含 PathFinder 的查找器
import sys
path_finder = None

for finder in sys.meta_path: if 'PathFinder' in str(finder): path_finder = finder break

# 将找到的 PathFinder 查找器删除 if path_finder: sys.meta_path.remove(path_finder)
# 导入 apple 模块 import apple
apple.py
print('模块 apple 被查找器发现了!')
ModuleNotFoundError: No module named 'apple'

Python 模块查找挂钩

Python 的模块查找器具有可拓展性,你可以编写自己的模块查找器,来报告模块所在的位置,比如,存放在互联网或局域网的 Python 模块的地址。官方文档将其描述为挂钩,你可以理解为添加查找器实现自定义查找方式的过程,或查找器本身。

内容分类

源码

finders.py·codebeatme/python-reference·GitHub
apple.py·codebeatme/python-reference·GitHub