如何解决 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
...
我用 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
...