gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:05:48 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com