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 中导入错误的主要内容,如果未能解决你的问题,请参考以下文章