python-3.x pylint误报E0401使用venv时vscode中出现导入错误

mm9b1k5b  于 2023-03-04  发布在  Python
关注(0)|答案(6)|浏览(372)

我在我的Mac OS上使用python3.6在这个文件夹/Users/kim/Documents/Apps/PythonApps/python36-miros-a3中创建了一个venv
我在激活虚拟环境后运行了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文件。
我可以做些什么来避免这些类型的误报导入错误?
我还尝试了以下方法:
1.转到命令行打开虚拟环境然后键入code以激活vscode如这里推荐的https://code.visualstudio.com/docs/setup/mac
1.我也试过这个https://donjayamanne.github.io/pythonVSCodeDocs/docs/troubleshooting_linting/

vqlkdk9b

vqlkdk9b1#

Pylint有一些怪癖。在这种情况下,它不知道在哪里找到你的模块,因为它在你的venv路径的子目录中。要解决这个问题:
1.将此设置放入工作区或文件夹设置中:

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

或者也许更好
1.生成.pylintrc文件,在集成终端激活venv运行:

pylint --generate-rcfile > .pylintrc

然后打开生成的文件,并取消注解**init-hook=**部分,使其成为:

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

阅读 .pylintrc 并根据需要调整设置。在这两种情况下,路径都应该指向“数据库”文件夹。
1.了解了pylint设置后,请按照正确的方式操作:

from database.database_dispatcher import ...

请看安东尼·索蒂尔的回答。

0sgqnhkj

0sgqnhkj2#

对我来说,pylint在这里标记此错误是正确的
顶层模块是database(它包含一个__init__.py文件)
您的导入应如下所示(完全绝对)

from database.database_dispatcher import ...

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

from .database_dispatcher import ...

我的猜测是,您当前调用的脚本是python ./database/main.py ...,它将./database放在sys.path的开头,因此看起来您的导入工作正常--然而,这是在绕过您的模块结构,您应该使用python -m database.main ...来调用脚本。
注意,python3.x中删除了 implicit relative 导入--尽管脚本sys.path插入的这个(imo)缺陷仍然存在。

byqmnocz

byqmnocz3#

只是我的0.02美元,我如何修复它在我的情况。
我的问题完全与全球安装Pylint有关,vscode试图使用全局安装的pylint,它根本不知道我在Python venv中安装的依赖关系。这个answer解决了我的问题。它指向here,解释了如何配置vscode以在我的项目中使用venv运行。一旦我这样做了,vscode立即抛出一个警告,说我没有安装掉毛工具,并提示我安装一个,一旦完成,我的掉毛假阳性消失。

6qqygrtg

6qqygrtg4#

扩展Gatmando的答案,您需要告诉vscode使用.env中的pylint,而不是全局pylint:
在工作区设置文件中:.vscode/settings.json,添加python.linting.pylintPath并将其指向virtualenv中的pylint包:

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

ukdjmx9f5#

另一个选项是在vscode项目根目录中创建.env文件:
.env文件:

PYTHONPATH=.

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

  • 它将用于vscode ide运行的任何东西(例如pylint、pytest),因此PYTHONPATH可能会在不同的工具之间发生冲突。
  • 您可以使用分隔符为PYTHONPATH指定多个目录以容纳多个工具。(例如:PYTHONPATH=src:.)但是,这不是跨操作系统的,因为Windows分隔符是;,而Linux/Mac是:

如果.envPYTHONPATH解决了您的问题,那就太好了。但由于警告,我最终使用了pylint --init-hook方法,因为它只影响pylint,而且可以跨操作系统:
.vscode/settings.json

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

sh7euo9m6#

将库添加到PYTHONPATH

当从bash执行pylint时,可以执行以下操作:

PYTHONPATH="${PYTHONPATH}:library_path" pylint project_path

相关问题