【问题标题】:Pylint failing to load plugin on a mercurial precommit hookPylint 无法在 mercurial 预提交挂钩上加载插件
【发布时间】:2020-02-15 12:29:31
【问题描述】:

我正在尝试创建一个在预提交上运行 pylint 的 mercurial 预提交挂钩。我的项目使用虚拟环境。

我已设置挂钩以在更改的文件上调用 pylint,但出现错误:

Traceback (most recent call last):
    File "/home/barmstrong/.virtualenvs/amp/bin/pylint", line 10, in <module>
        sys.exit(run_pylint())
      File "/home/barmstrong/.virtualenvs/amp/lib/python3.6/site-packages/pylint/__init__.py", line 20, in run_pylint
        Run(sys.argv[1:])
      File "/home/barmstrong/.virtualenvs/amp/lib/python3.6/site-packages/pylint/lint.py", line 1583, in __init__
        linter.load_plugin_modules(plugins)
      File "/home/barmstrong/.virtualenvs/amp/lib/python3.6/site-packages/pylint/lint.py", line 636, in load_plugin_modules
        module = modutils.load_module_from_name(modname)
      File "/home/barmstrong/.virtualenvs/amp/lib/python3.6/site-packages/astroid/modutils.py", line 202, in load_module_from_name
        return load_module_from_modpath(dotted_name.split("."), path, use_sys)
      File "/home/barmstrong/.virtualenvs/amp/lib/python3.6/site-packages/astroid/modutils.py", line 244, in load_module_from_modpath
        mp_file, mp_filename, mp_desc = imp.find_module(part, path)
      File "/usr/lib/python3.6/imp.py", line 297, in find_module
        raise ImportError(_ERR_MSG.format(name), name=name)
    ImportError: No module named 'common'

我相信这是由于 .pylintrc 文件中的一个自定义插件尝试从我的项目目录中加载的:

'/common/blah/file.py'

.pylintrc 中,它被引用:

common.blah.file

我尝试将此添加到PYTHONPATH running:

sys.path.append('path/common')

但错误仍然存​​在。我该如何解决这个问题,以便它可以加载我的插件? (我也尝试过将公共模块添加到PYTHONPATH 的变体,但没有成功)。

编辑:如果我从.pylintrc 中删除common.blah/file.py 文件,它可以工作,所以我需要弄清楚如何import 它。我尝试在PYTHONPATH 中添加“common”,但似乎不起作用。

【问题讨论】:

  • sys.path.append('path/common') 是在哪里做的?您是否尝试过实际使用 PYTHONPATH 环境变量?
  • @lxop 我在导入后在文件开头执行 sys.path.append。我还没有尝试将它实际添加到 PYTHONPATH。
  • 在哪个文件的开头?如果它是您正在 linting 的文件,那么它将无济于事,因为它实际上并没有被评估。您需要在 PYTHONPATH 环境变量中设置它
  • 你能展示你完整的钩子吗?

标签: python mercurial pylint mercurial-hook


【解决方案1】:

除非你正在编辑 pylint 的源代码,否则有

sys.path.append('path/common')

根本不会有帮助,因为 pylint 没有评估您的源文件。即使是这样,它也会在它尝试加载你的插件之后发生,所以它已经失败了。

您需要通过设置 PYTHONPATH 环境变量来添加路径,以便 Pylint 在运行时可以使用它。不要忘记要添加的路径不是'path/common',而是'path/',因为它需要是common 包所在的路径,而不是包本身的路径。

【讨论】:

    【解决方案2】:

    当我通过 .pylintrc 向 pylint 添加插件时遇到了同样的问题:

    [MASTER]
    
    load-plugins=path.to.my.plugin
    

    这在我的机器上运行良好,但在 CircleCI 上给了我ImportError。解决方案(基于@lxop 的答案)是在 CircleCI 上使用自定义 PYTHONPATH 运行 pylint:

    PYTHONPATH=$(pwd) pylint
    

    【讨论】:

      【解决方案3】:

      显然这是一个可以安装的依赖项来解决你的问题,你可以找到模块here

      【讨论】:

      • 不,我很确定它正在尝试加载我存储在 'common/pylint/plugin.py' 中的自定义插件,但它找不到它。
      猜你喜欢
      • 2020-07-28
      • 1970-01-01
      • 2013-05-13
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2015-04-20
      相关资源
      最近更新 更多