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

Posted

技术标签:

【中文标题】pylint 误报 E0401 在使用 venv 时在 vscode 中导入错误【英文标题】:pylint false positive E0401 import errors in vscode while using venv 【发布时间】: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文件。

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

我也尝试了以下方法:

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

【问题讨论】:

【参考方案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 路径的子目录中。要解决这个问题:

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

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

    或者,也许更好

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

    pylint --generate-rcfile > .pylintrc 
    

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

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

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

    了解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 警告“无法导入...”消失了。再次感谢!

以上是关于pylint 误报 E0401 在使用 venv 时在 vscode 中导入错误的主要内容,如果未能解决你的问题,请参考以下文章

Python - 使用Pylint检查分析代码

如何使用 Pylint 来规范 Python 代码风格

PyCharm 中使用 Pylint 控制代码质量

SonarQube 忽略 pylint 结果

如何使用 Pylint 来规范 Python 代码风格

如何在 Jupyter Notebooks 中使用 Pylint 或其他 linter?