正确的相对导入:“无法导入模块”

Jim*_*hez 8 python python-3.x visual-studio-code

我有一个结构如下的项目:

.
??? myapp
    ??? app.py
    ??? models
    ?   ??? hello.py
    ?   ??? world.py
    ??? requirements.txt
Run Code Online (Sandbox Code Playgroud)

我有两个模型,helloworld。这两种模型都是从app.py我将其导入的地方使用的:

from models.hello import Hello
from models.world import World
Run Code Online (Sandbox Code Playgroud)

而且world还需要使用hello。我想这在world.py

from models.hello import Hello
Run Code Online (Sandbox Code Playgroud)

当我运行该应用程序时,以上内容在技术上有效,但是VSCode的Python扩展给我以下错误:

E0401:Unable to import 'models.hello'.
Run Code Online (Sandbox Code Playgroud)

从同一目录导入子模块的正确方法是什么?如何避免VSCode中的此错误?

Don*_*Don 12

您收到的错误是由名为的python linter报告的错误pylint。因此,问题实际上并非特定于vscode扩展。

有两种解决方案:

  1. 请尝试.env使用vape在您的项目目录中添加文件PYTHONPATH=./myapp,这将告诉pylint在哪里找到您的模块

  2. 或者myapp直接在vscode中打开文件夹,而不是在vscode中打开父目录。

  • 使用 .env 文件解决了 VS Code 无法通过 ctrl+click 导航到导入的本地类的问题。谢谢! (5认同)
  • @Christian,您在项目的根目录创建一个“.env”文件,并在其中放置变量“PYTHONPATH=path_to_your_package”。在作者的示例中,从根目录到包的路径是“./myapp”,因此他需要在环境文件中放入变量“PYTHONPATH=./myapp” (4认同)
  • 我似乎太愚蠢了。您能否更具体一些并给出一个参考 venv 的示例?我也没有得到 myapp 定义。谢谢 (2认同)

Sht*_*fan 7

错误来自pylint。您需要将此行添加到 settings.json 文件(VS Code)中:

"python.linting.pylintArgs": ["--init-hook",
        "import sys; sys.path.append('<absolute path to myapp directory>')"],
Run Code Online (Sandbox Code Playgroud)


Sco*_*art 5

在您的.vscode/settings.json(工作区的根目录中)中,您需要以下两行:

一种是在虚拟环境中使用 pylint(如果有的话),以便 pylint 能够感知到这一点。如果您的 pylint 或虚拟环境位于不同的位置,您将需要调整以下内容。

  "python.linting.pylintPath": "${workspaceFolder}/api/venv/bin/pylint"
Run Code Online (Sandbox Code Playgroud)

其一,正如 Shtefan上面提到的,让 pylint 知道项目的 python 部分在哪里:

  "python.linting.pylintArgs": [
    "--init-hook",
    "import sys; sys.path.append('${workspaceFolder}/api')"
  ]
Run Code Online (Sandbox Code Playgroud)

如果您尚未在虚拟环境中设置 vscode,则此附加行可能会有所帮助,如果您的虚拟环境路径与以下路径不匹配,则可能需要再次进行修改。

  "python.pythonPath": "${workspaceFolder}/api/venv/bin/python",
Run Code Online (Sandbox Code Playgroud)


Ale*_*and 4

由于hello.pyworld.py位于同一文件夹(也称为包)中,因此您应该在world.py中导入 Hello 类,如下所示:

from .hello import Hello
Run Code Online (Sandbox Code Playgroud)

正如该线程中所述:What does a . Python 中的 import 语句是什么意思?

这里.表示从当前包导入。

  • 这解决了 vscode 错误 buy Breaks the application。`app.py` 是应用程序的入口点,所以即使在 **world.py** 中,我也无法从 **hello** 导入,因为 **hello** 位于 **models** 中,而不是项目根目录。我得到“没有名为‘hello’的模块” (7认同)