背景
当您使用命名空间包并将代码库划分为单独的文件夹时,我已经厌倦了 pylint 无法导入文件的问题。因此,我开始深入研究已被确定为问题根源的 astNG 源代码(参见关于 astng 的错误报告8796)。问题的核心似乎是在imp.find_module
查找导入的过程中使用了自己的 python。
发生的情况是导入的第一个(子)包 - a
in import a.b.c
- 被提供给find_module
路径None
。无论返回什么路径,都会被送入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 的方法,它将返回所有可能的匹配项或排除列表?我也对完全不同的解决方案持开放态度。最好不要手动修补 python,但这并非不可能 - 至少对于本地解决方案而言。
(警告购买者:我正在运行 python 2.6,由于当前公司政策无法升级,p3k 等的建议不会被标记为接受,除非它是唯一的答案。)