【问题标题】:How to solve "unresolved import" and "unable to import" messages in Python projects?如何解决 Python 项目中的“未解析导入”和“无法导入”消息?
【发布时间】:2020-04-01 22:21:37
【问题描述】:

我用 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)。因此,index 函数的 IntelliSense 不起作用。

但是 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",

【问题讨论】:

    标签: python visual-studio-code module warnings python-import


    【解决方案1】:

    解决方案 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
    ... 
    

    【讨论】:

    • 您还应该将__init__.py 文件添加到您的目录中以将它们打包,这样您就可以进行相对导入,例如from .views import index,否则您将无法引用该包/目录之外的任何代码。
    • 这是我的第一个想法,但我放弃了它,因为我在运行脚本时出错了。此外,由于Python 3.3+,不需要空的__init__.py 文件。
    • 我不会说__init__.py“不需要文件”,因为将它们排除在外意味着您拥有命名空间包而不是标准包,并且它们的语义在潜在的重要方面存在细微差别。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2021-11-20
    • 1970-01-01
    • 2021-06-06
    • 2014-02-09
    相关资源
    最近更新 更多