imp.find_module的替代品?

Per*_*ell 5 python namespaces pylint importerror

背景

我已经厌倦了当你使用命名空间包并将你的代码库划分为单独的文件夹时,pylint无法导入文件的问题.因此,我开始深入研究astNG源代码,该代码已被确定为问题的根源(参见astng上的bugreport 8796).这个问题的核心似乎是在imp.find_module寻找进口的过程中使用蟒蛇.

什么情况是,进口的第一个(分)包- aimport 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)
Run Code Online (Sandbox Code Playgroud)

问题

这就是被打破的:你只能得到第一个最好的命中find_module,可能有也可能没有你的子包.如果您没有找到子包,则无法退出并尝试下一个.

我尝试显式使用sys.path而不是None,这样结果可以从路径列表中删除并进行第二次尝试,但是python的模块查找器非常聪明,不必在路径中完全匹配,无论如何,使这种方法无法使用 - 尽我所知.

眼泪的辩护

是否有一个替代find_modules将返回所有可能的匹配或采取排除列表?我也对完全不同的解决方案持开放态度.最好不要手工修补python,但这不是不可能 - 至少对于本地解决方案.

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

jd.*_*jd. 2

我也厌倦了 PyLint 中的这种限制。

我不知道 imp.find_modules() 的替代品,但我想我找到了另一种方法来处理 PyLint 中的命名空间包。请参阅我对您链接到的错误报告的评论 (http://www.logilab.org/ticket/8796)。

这个想法是使用 pkg_resources 来查找命名空间包。这是我对 的补充logilab.common.modutils._module_file(),就在 之后while modpath

  while modpath:
      if modpath[0] in pkg_resources._namespace_packages and len(modpath) > 1:
          module = sys.modules[modpath.pop(0)]
          path = module.__path__
Run Code Online (Sandbox Code Playgroud)

这不是很精致,而且只处理顶级命名空间包。