ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – imp.find_module的替代品?

2019-05-18 13:47:18  阅读:424  来源: 互联网

标签:python namespaces pylint importerror


背景

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

会发生的是导入的第一个(子)包 – 导入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将返回所有可能的匹配或采取排除列表?我也对完全不同的解决方案持开放态度.最好不要手工修补python,但这不是不可能 – 至少对于本地解决方案.

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

解决方法:

我已经厌倦了PyLint中的这个限制.

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

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

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

这不是很精致,只能处理顶级命名空间包.

标签:python,namespaces,pylint,importerror
来源: https://codeday.me/bug/20190518/1128359.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有