python - `sys.meta_path` 和 `sys.path_hooks` 导入器对象有什么区别?

标签 python python-import python-module

使用 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.pathsys.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/

相关文章:

python - 对多行执行函数

python - 在 Django 中登录管理员

python - 为什么有些包需要用 'from' 导入,而其他包需要用 'import' 导入?

python - 在多处理模块中为每个进程重新加载 Python 模块

python - 使用通配符导入的原因是什么?

python - 从 mp4 python 下载 Youtube 音频

python - 在 bottlepy after_request Hook 中访问响应对象

python - 使用不同的参数同时运行相同的函数

python - 导入错误 : No module named '' when importing my own sub-package

python - 无法在 Linux 上导入 Python 包