如何解决 Python 项目中的 "unresolved import" 和 "unable to import" 消息?

How to solve "unresolved import" and "unable to import" messages in Python projects?

我用 VSCode 打开了一个目录(在 WSL Ubuntu 上),结构如下:

.
├── .vscode
│   ├── launch.json
│   └── settings.json
├── src
│   └── polls
│       ├── aiohttpdemo_polls
│       │   ├── db.py
│       │   ├── main.py
│       │   ├── routes.py
│       │   ├── settings.py
│       │   └── views.py
│       ├── config
│       │   └── polls.yaml
│       └── init_db.py
└── ve_websocket

我在导入与调用它的目录位于同一目录中的文件时收到警告消息 unresolved import ...。示例:对于 routes.py

from views import index

def setup_routes(app):
    app.router.add_get("/", index)

我得到 unresolved import 'views' Python(unresolved-import)。因此 IntelliSense 对于 index 函数不起作用。

但是 IntelliSense 建议使用这种表示法:

from polls.aiohttpdemo_polls.views import index

有了它,index 函数现在可以被 IntelliSense 识别并且不会出现警告消息,但是在保存文件时我现在收到此错误消息 Unable to import 'polls.aiohttpdemo_polls.views' pylint(import-error)

所以我不能运行这个脚本:

[polls]$ python init_db.py

我的 settings.json 文件有这样的配置:

"python.pythonPath": "ve_websocket/bin/python3.8",
"python.linting.pylintEnabled": true,
"python.linting.pylintPath": "pylint",

解决方案 1: settings.json

解决方案是使用 absolute imports(IntelliSense 建议),并且需要使用 PYTHONPATH 环境变量,因此我们需要将这些行添加到工作区的 settings.json 文件中。

"terminal.integrated.env.linux": {
    "PYTHONPATH": "${workspaceFolder}/src",
},

之后,我们打开终端(从 VSC)并需要确认更改,然后重新打开终端,我们可以 运行 脚本没有错误,但是 VSC IDE 仍然显示错误在 from 关键字上标记,忽略它们,因为被导入的对象及其所有属性都被 IntelliSense 识别,并且您可以 运行 您的脚本没有任何问题。

解决方案 2: sys.path

之前的解决方案的问题在于它仅在您使用 VSC 的终端时才有效。因此,您可以在每个需要导入对象的脚本中使用 sys.path。例如,对于我的 init_db.py 文件:

import sys
from pathlib import Path
sys.path.append(str(Path.cwd().parent))

from sqlalchemy import create_engine, MetaData

from polls.aiohttpdemo_polls.settings import config
from polls.aiohttpdemo_polls.db import question, choice
...