Python 模块查找器介绍
关注 1421
本节所讲述的 Python 模块查找器,同样适用于包,因为包是特殊的模块。
Python 模块查找器
模块查找器作为 Python 导入系统的一部份,其对应的英文为 Module Finders,他的作用是查找定位需要载入的模块。这通常发生在import
语句执行时,模块查找器可能会被启动并返回相关模块的信息,以便进行下一步的载入操作,如果模块查找器未找到所需模块,那么将导致异常ModuleNotFoundError
。
模块查找器何时工作?
只有当模块缓存中没有需要载入的模块时,模块查找器才会运行并定位模块,请留意这一点,他说明模块查找器并不需要确定模块是否存在缓存,这项工作在启动查找器之前已经完成。如果你希望编写自己的模块查找器,那么不必在缓存上浪费时间。
模块
想要了解模块缓存,你可以查看Python 模块缓存一段。
Python 模块查找器种类
模块查找器可以分为元路径查找器(Meta Path Finder)和路径条目查找器(Path Entry Finder),其中路径条目查找器具体实现了基于路径定位 Python 脚本的功能,比如,定位模块Dog
对应的脚本文件。
事实上,元路径查找器和路径条目查找器均不止一个,他们被保存在两个不同的列表对象中。
路径条目查找器隶属于元路径查找器
需要指出,路径条目查找器只是服务于元路径查找器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 的模块查找器具有可拓展性,你可以编写自己的模块查找器,来报告模块所在的位置,比如,存放在互联网或局域网的模块的地址。官方文档将其描述为挂钩,你可以理解为添加查找器实现自定义查找方式的过程,或查找器本身。
内容分类
源码
finders.py·codebeatme/python-reference·GitHub
apple.py·codebeatme/python-reference·GitHub