使用 importlib
,“Meta Path Finder”(通过遍历 sys.meta_path 找到)和“Path Entry Finder”(通过遍历 sys.path_hooks 找到)有什么区别?
第一种类型在导入开始时调用,但第二种类型何时使用?两者都返回一个规范对象吗?
我想实现自定义导入,其中可以从 *.py 或 *.pyc 以外的源导入模块,例如来自流。如何做到这一点?
最佳答案
当要导入模块时,解释器首先遍历 sys.meta_path
中的对象列表,调用 find_spec()
或(自 3.4 起已弃用) find_module()
方法。 ) 该接口(interface)记录在 importlib.abc.MetaPathFinder 中抽象基类。)这些在检查任何其他导入器(包括卡住和内置)之前被查询,因此可以覆盖任何其他导入处理。
sys.meta_path
中的 PathFinder
对象使用了 sys.path
和 sys.path_hooks
。 (在 Python < 3.4 中除外,其中 PathFinder
功能内置于解释器中,当 sys.meta_path
中没有任何内容可以加载模块时使用。)
PathFinder
遍历 sys.path
中的路径列表。对于每条路径,如果finder尚未在 sys.path_importer_cache
中为该路径缓存它会遍历 sys.path_hooks
中的可调用项列表,使用路径调用每个可调用项以查看它是否会产生一个发现者;它缓存在 sys.path.importer_cache_
中找到的第一个。
一旦找到查找器,它就会通过 find_spec()
或已弃用的 find_module()
方法查询它是否可以找到该模块。如果是这样,它可以继续导入它,否则它会从 sys.path
上的下一个路径开始上面的步骤。
这最初在 PEP 302 中进行了描述, 但是 PEP 451几乎是现代行为; importlib文档似乎是当前规范。
在我的 personal notes 中总结了相当多的细节(带有更多链接) .
关于python - `sys.meta_path` 和 `sys.path_hooks` 导入器对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41941079/