gpt4 book ai didi

python - imp.find_module 的替代品?

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

背景

当您使用命名空间包并将代码库划分到单独的文件夹中时,pylint 无法导入文件的问题让我感到厌烦。因此,我开始深入研究 astNG 源代码,它已被确定为问题的根源(请参阅 astng 上的错误报告 8796)。问题的核心似乎是在查找导入的过程中使用 python 自己的 imp.find_module

导入的第一个(子)包 - import a.b.c 中的 a - 被提供给 find_module 路径。无论返回的路径是什么,都会被送入 find_module 查找循环中的下一次传递,您在上一个示例中尝试找到 b

来自 logilab.common.modutils 的伪代码:

path = None
while import_as_list:
try:
_, found_path, etc = find_module(import_as_list[0], path)
#exception handling and checking for a better version in the .egg files
path = [found_path]
import_as_list.pop(0)

问题

这就是问题所在:您只能从 find_module 中获得第一个最佳命中,其中可能包含也可能不包含您的子包。如果您没有找到子包,您将无法退出并尝试下一个。

我尝试明确使用 sys.path 而不是 None,以便可以从路径列表中删除结果并进行第二次尝试,但是 python 的模块查找器足够聪明,不需要完全匹配在路径中,使这种方法无法使用 - 无论如何据我所知。

泪眼恳求

是否有 find_modules 的替代方法,它将返回 ALL 可能的匹配项或获取排除列表?我也愿意接受完全不同的解决方案。最好不要手动修补 python,但这并非不可能 - 至少对于本地解决方案而言。

(注意买者:我正在运行 python 2.6,并且由于当前公司政策的原因无法升级,对 p3k 等的建议不会被标记为已接受,除非它是唯一的答案。)

最佳答案

从 Python 2.5 开始,正确的方法是使用 pkgutil.iter_modules() (对于平面列表)或 pkgutil.walk_packages() (对于子包树)。两者都与命名空间包完全兼容。

例如,如果我只想找到“jmb”的子包/子模块,我会这样做:

import jmb, pkgutil
for (module_loader, name, ispkg) in pkgutil.iter_modules(jmb.__path__, 'jmb.'):
# 'name' will be 'jmb.foo', 'jmb.bar', etc.
# 'ispkg' will be true if 'jmb.foo' is a package, false if it's a module

您还可以使用 iter_modules 或 walk_packages 遍历 sys.path 上的所有模块;有关详细信息,请参阅上面链接的文档。

关于python - imp.find_module 的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5741362/

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