使用 venv 时 vscode 中的 pylint 误报 E0401 导入错误

pylint false positive E0401 import errors in vscode while using venv

我在我的 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一直抱怨导入语句说它不存在。

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

我该怎么做才能避免此类错误的 pos 主动导入错误?

我也试过以下方法:

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

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 并根据需要调整设置。在这两种情况下,路径都应指向您的 'database' 文件夹。

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

    from database.database_dispatcher import ...
    

    参见 Anthony Sottile 的

对我来说,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 插入仍然存在.

只需 0.02 美元,了解我在我的情况下如何修复它。

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

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

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

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

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

.env 文件:

PYTHONPATH=.

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

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

  • 您可以为 PYTHONPATH 指定多个目录,以使用分隔符容纳多个工具。 (示例:PYTHONPATH=src:.)但是,这不是交叉 OS,因为 Windows 分隔符是 ; 而 Linux/Mac 是 :


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

.vscode/settings.json

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