【问题标题】:pylint false positive E0401 import errors in vscode while using venvpylint 误报 E0401 在使用 venv 时在 vscode 中导入错误
【发布时间】:2018-12-08 06:39:58
【问题描述】:

我在这个文件夹中的 mac os 上使用 python3.6 创建了一个 venv /Users/kim/Documents/Apps/PythonApps/python36-miros-a3

我在激活虚拟环境后运行了pip install pylint

我的工作区在/Users/kim/Documents/Apps/WebApps/miros-a3

在我的 vscode 工作区中,我有以下工作区设置

{
    "folders": [
        {
            "path": "."
        }
    ],
    "settings": {
        "python.pythonPath": "/Users/kim/Documents/Apps/PythonApps/python36-miros-a3/bin/python3.6",
        "python.venvPath": "/Users/kim/Documents/Apps/PythonApps"
    }
}

我尝试为 pylint 设置自定义路径并更改 venvpath。

pylint 一直抱怨 import 声明说它不存在。

如你所见,它们在同一个文件夹中,我绝对可以执行我的python文件。

如何避免此类误报导入错误?

我也尝试了以下方法:

  1. 转到命令行打开虚拟环境,然后键入code 以激活这里推荐的vscode https://code.visualstudio.com/docs/setup/mac
  2. 也试过这个https://donjayamanne.github.io/pythonVSCodeDocs/docs/troubleshooting_linting/

【问题讨论】:

    标签: python-3.x visual-studio-code virtualenv pylint python-venv


    【解决方案1】:

    另一种选择是在 vscode 项目根目录中创建一个.env file

    .env文件:

    PYTHONPATH=.
    

    使用.env 文件的一些注意事项:

    • 它将用于 vscode ide 运行的任何东西(例如 pylint、pytest),因此 PYTHONPATH 可能会在不同工具之间发生冲突。

    • 您可以为PYTHONPATH 指定多个目录,以通过使用分隔符来容纳多个工具。 (例如:PYTHONPATH=src:.)但是,这不是跨操作系统,因为 Windows 分隔符是 ; 而 Linux/Mac 是 :


    如果 .env PYTHONPATH 解决了您的问题,那就太好了。但由于注意事项,我最终使用了pylint --init-hook 方法,因为它只影响pylint,并且可以跨操作系统:

    .vscode/settings.json

        "python.linting.pylintArgs": [
            "--init-hook",
            "import sys, os; sys.path.insert(0, os.path.join('src', 'foo'))"
        ]
    

    【讨论】:

      【解决方案2】:

      扩展 Gatmando 的答案,您需要告诉 vscode 使用 .env 中的 pylint 而不是全局 pylint:

      在您的工作区设置文件:.vscode/settings.json,添加python.linting.pylintPath 并将其指向您的virtualenv 中的pylint 包:

      {
          "python.pythonPath": ".env/bin/python",
          "python.linting.pylintPath": ".env/bin/pylint"
      }
      

      【讨论】:

        【解决方案3】:

        只需 0.02 美元就可以解决我的情况。

        我的问题完全与全局安装 pylint 以及在 venv 中编码有关。 vscode 试图使用全局安装的 pylint,它根本不知道我在 Python venv 中安装的依赖项。这个answer 解决了我的问题。它指向here,它解释了如何配置 vscode 以使用我的项目的 venv 运行。一旦我这样做了,vscode 立即发出警告说我没有安装 linting 工具并提示我安装一个。一旦完成,我的 linting 误报就消失了。

        【讨论】:

        • 我喜欢这个解决方案,但唯一的问题是 pylint 将在需求文件中。我没关系。
        • @ericDaWang 您可以创建一个单独的requirements-dev.txt 并将pylint 和其他仅用于开发的包放入其中。
        【解决方案4】:

        Pylint 有一些怪癖。在这种情况下,它不知道在哪里可以找到您的模块,因为它位于您的 venv 路径的子目录中。要解决这个问题:

        1. 将此设置放入您的工作区或文件夹设置中:

          "python.linting.pylintArgs": [
              "--init-hook",
              "import sys; sys.path.append('<path to folder your module is in>')"
          ]
          

          或者,也许更好

        2. 生成 .pylintrc 文件。从已激活 venv 的集成终端运行:

          pylint --generate-rcfile > .pylintrc 
          

          然后打开生成的文件并取消注释 init-hook= 部分为:

          init-hook='import sys; sys.path.append("<path to folder you module is in>")'
          

          阅读 .pylintrc 并根据需要调整设置。在这两种情况下,路径都应指向您的“数据库”文件夹。

        3. 了解pylint设置后,正确做法:

          from database.database_dispatcher import ...
          

          参见 Anthony Sottile 的 this answer

        【讨论】:

        • 我用了你的第二种方法,效果很好!谢谢你:)
        【解决方案5】:

        对我来说,pylint 在此处标记此错误是正确的

        顶级模块是database(它包含一个__init__.py 文件)

        您的导入应该看起来像(完全绝对)

        from database.database_dispatcher import ...
        

        或(显式相对)(是的!模块名称前的. 是故意的)

        from .database_dispatcher import ...
        

        我的后续猜测是,您当前正在以 python ./database/main.py ... 的形式调用脚本,这会将 ./database 放在 sys.path 的开头,因此 显示 您的导入正在运行正确 - 但是,这是在回避您的模块结构。您应该使用 python -m database.main ... 来调用您的脚本。

        请注意,隐式相对导入在 python 3.x 中已被删除——尽管这个 (imo) 脚本 sys.path 插入仍然存在。

        【讨论】:

        • 感谢您的解释。所以我在应用程序根目录中删除了 init.py,pylint 警告“无法导入...”消失了。再次感谢!
        猜你喜欢
        • 2019-11-09
        • 2018-01-01
        • 2019-09-02
        • 2019-09-25
        • 1970-01-01
        • 2019-08-05
        • 2020-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多