【发布时间】:2011-08-10 03:02:34
【问题描述】:
背景
当您使用命名空间包并将代码库划分为单独的文件夹时,我已经厌倦了 pylint 无法导入文件的问题。因此,我开始深入研究已被确定为问题根源的 astNG 源代码(请参阅关于 astng 的错误报告8796)。问题的核心似乎是在查找导入的过程中使用了 python 自己的 imp.find_module。
会发生什么情况是导入的第一个(子)包 - import a.b.c 中的 a - 使用 None 路径馈送到 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 namespaces importerror pylint