【问题标题】:pylint doesn't point to virtualenv pythonpylint 不指向 virtualenv python
【发布时间】:2013-07-29 11:41:51
【问题描述】:

我对 python 很陌生,目前我正在尝试使用 pylint 来检查代码质量。我遇到了问题。我的 pylint 没有指向 virtualenv python 解释器。这是我运行 pylint --version 时得到的输出

 $ pylint --version
   pylint 0.21.1,
   astng 0.20.1, common 0.50.3
   Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45)
   [GCC 4.4.7 20120313 (Red Hat 4.4.7-3)]

在 virtualenv 中,我安装了 python 2.7。如果有人能指出我如何解决这个问题,我会感谢你的帮助。

【问题讨论】:

  • which pylint 的输出是什么,你的 venv 在哪里?
  • @kroolik 它是 /usr/bin/pylint 而我的 virtualenv 是 ~/virtenvs/my_env/bin/python
  • 您是否安装了启用 venv 的 pylint?使用pip install pylint 安装pylint 并激活venv 后,which pylint 应指向~/virtenvs/my_envs/bin/pylint
  • 是的,我确实安装了 pylint 并启用了我的 virtenv。
  • 你有~/virtenvs/my_env/bin/pylint文件吗?

标签: python virtualenv pylint


【解决方案1】:

一个便宜的技巧是使用 virtualenv python 运行(全局)pylint。您可以使用python $(which pylint) 而不仅仅是pylint 来执行此操作。在 zsh 上,你也可以使用python =pylint

【讨论】:

  • 太好了,谢谢。因为我使用 Python 3,所以我不得不做$(which pylint3)
  • @NoufalIbrahim 我非常爱你,因为这个=command hack。使用 zsh 已经有一段时间了,但我从来没有偶然发现过。
  • 不客气,卢克。这只是写$(which foo)的更简洁的方式。
  • 不幸的是,它似乎不适用于带有 ALE 插件的 Vim。
  • 这对我不起作用,因为全局包(这里是 pylint)默认情况下在 venv 中不可用。在 venv 中运行 python /usr/bin/pylint 会得到 importlib.metadata.PackageNotFoundError: pylint
【解决方案2】:

我相当确定您需要在虚拟环境下安装 pylint,然后运行它的实例。

更新 - 让生活更轻松:

我建议任何经常在虚拟环境中工作的人创建一个批处理文件(在已知位置或路径上),或使用类似以下内容的 bash 脚本,称为 getlint.bat

pip install pylint

在激活虚拟环境后调用此命令会将 pylint 安装到该虚拟环境中。如果您可能处于离线状态或互联网连接不佳,您可以在 当您有良好的互联网连接时,一次(可能每个 python 2 和 3 一次):

mkdir C:\Some\Directory\You\Will\Leave\Alone
pip download --dest=C:\Some\Directory\You\Will\Leave\Alone pylint

这会将pylint及其依赖项下载到C:\Some\Directory\You\Will\Leave\Alone,您可以将getlint.bat修改为:

pip install pylint --find-links=C:\Some\Directory\You\Will\Leave\Alone

然后它将使用预下载的版本。

【讨论】:

  • Steve 是正确的,我会补充一点,从全局 python 中 ^uninstalling^ 它也是一个好主意。这样你就可以确保你运行的是正确的 pylint。
  • 有一个悲伤的 +1,因为在使用多个 (10+) virtualenvs 时这是一个真正的痛苦。
  • @mpiskore - 我扩大了答案,让生活更轻松。
  • 我想补充一点,如果您使用 --system-site-packages 创建了 virtualenv(例如,因为您使用它来运行您的编辑器并且不想调试缺少系统包的问题),您可能需要将--force-reinstall 传递给 Pip。或者--ignore-installed 也可能有效,但我没有尝试过,所以我不确定,我不能评论什么更好。
【解决方案3】:

如果您手动执行 pylint,Noufal Ibrahim's answer 可以工作。

如果您从编辑器/IDE 执行 pylint,则需要正确配置插件。

这可能会变得棘手。这可能被认为是每个 IDE/插件的错误,但事实就是如此。

按照another answer 中的建议将/usr/bin/pylint 修改为#!/usr/bin/env python 会在每次使用pylint(手动使用或任何编辑器集成)时修复此问题。

但是,至少在 Debian 中,使用 #!/usr/bin/pythondesign choice,而不是错误。有关基本原理,请参阅 here

为避免修改该系统文件,可以在/usr/local/bin 中创建/usr/bin/pylint 的副本:

cp /usr/bin/pylint /usr/local/bin/pylint
vi usr/local/bin/pylint # Edit the file to use /usr/bin/env python

这不会被 pylint 更新破坏,但仍然侵犯了 Debian 的“强烈首选”。

此方法需要 root 权限。非特权用户可以创建别名

alias pylint='/usr/bin/env python $(which pylint)'.

我总是在 virtualenv 中开发,我设置了一个 postmkvirtualenv 钩子来在创建 virtualenv 时自动安装 pylint 和 flake8,所以我不再使用 debian 分发的版本了。

【讨论】:

【解决方案4】:

我也遇到了这个问题。我的解决方案是简单地编辑 pylint 程序的 shebang,就像这样......(不过,你的 pylint 路径可能与我的不同)

$ sudo vim /usr/bin/pylint

替换:

#!/usr/bin/python

与:

#!/usr/bin/env python

【讨论】:

  • 为一个用户更改这样的系统程序并不是一个好习惯。
  • @NoufalIbrahim 这不更像是来自 pylint 开发人员的 bug,会影响系统的所有用户吗?
  • 不。这是发行版管理人员的决定,以确保 pylint 将像宣传的那样工作并且独立于您的本地 PATH 设置。
  • @NoufalIbrahim 哦……是这样吗?很有教育意义,好人。这是一个大问题。我可以要求您提交更好的答案/解决方法吗?我觉得您有一个使用本地 PATH 设置的新颖解决方案。
  • @starlocke 我不明白你在问什么。
【解决方案5】:

问题已在聊天中解决(链接在 cmets)。

问题在于使用sudo yum install pylint,因为它在全局环境中安装了pylint。解决方案是使用以下命令:

pip install -i http://f.pypi.python.org/simple pylint

注意-i 的用法,因为对于提问者来说,常规索引似乎被破坏了。

【讨论】:

    【解决方案6】:

    我知道这个问题已经有一段时间没有回答了,但我只是想我应该把这篇文章留在这里,以防其他人遇到同样的问题。

    如果由于某种原因您需要将pylint 保留在全局空间而不是您的虚拟环境中,您可以使用此处的建议:PyLint + VirtualEnv

    它基本上说使用init-hook 配置您的pylint 和Python 程序的编码版本,该程序将使用全局pylint 并加载环境的其余部分。

    【讨论】:

      【解决方案7】:

      你可以通过调用目标python解释器到达那里:

      ./env/bin/python -m pylint ...
      
      # or in an already active env
      python -m pylint ...
      

      【讨论】:

        【解决方案8】:

        当你使用 Pipenv / virtualenv 时,在 virtualenv 中安装 pylint:

        pipenv install --dev pylint
        

        或者,如果您不使用 Pipenv,请在激活 virtualenv 后使用 pip 安装它:

        # activate virtualenv, e.g. `. env/bin/activate`
        pip install pylint
        

        【讨论】:

          【解决方案9】:

          我正在使用 Syntastic + Pylint 组合,并且由于我有许多不同的 virtualenvs 可以在任何给定时间处理,因此我在 virtualenv 命令上创建了一个包装器,其中其他一些东西,在满足所有要求后安装 pylint

          这样,每当我激活一个 virtualenv 时,我都会得到它自己的 pylint 版本。

          希望这会有所帮助,并感谢有关从 @briford-wylie 中删除全局的提示

          【讨论】:

            【解决方案10】:

            今天遇到了同样的问题。继续ThorSummoner 的回答,在 Pipenv 等虚拟环境中使用 Pylint 和 pylint-django 时,请确保使用目标 python 解释器调用 pylint (python -m pylint)

            一种可以在本地和 CI 上工作的好方法是在 Pipfile 的脚本部分写下 lint 命令:

            [scripts]
            lint = "python -m pylint [--options] all-my-modules-names..."
            

            那么调用 pylint 就这么简单:

            pipenv run lint
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-05-31
              • 1970-01-01
              • 1970-01-01
              • 2013-11-16
              • 2021-10-06
              • 2012-08-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多