Python 模块查找器介绍
本节所讲述的 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
。
# 尝试找到名称包含 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
print('模块 apple 被查找器发现了!')
ModuleNotFoundError: No module named 'apple'
Python 模块查找挂钩
Python 的模块查找器具有可拓展性,你可以编写自己的模块查找器,来报告模块所在的位置,比如,存放在互联网或局域网的 Python 模块的地址。官方文档将其描述为挂钩,你可以理解为添加查找器实现自定义查找方式的过程,或查找器本身。
内容分类
源码
finders.py·codebeatme/python-reference·GitHub
apple.py·codebeatme/python-reference·GitHub