适当的相对进口:“无法导入模块”

时间:2018-02-25 13:04:07

标签: python python-3.x visual-studio-code

我的项目结构如下:

.
└── myapp
    ├── app.py
    ├── models
    │   ├── hello.py
    │   └── world.py
    └── requirements.txt

我有两个模型,helloworld。这两个模型都在app.py使用,我在这里导入它们:

from models.hello import Hello
from models.world import World

world也需要使用hello。我在world.py中尝试了这个:

from models.hello import Hello

以上技术在我运行应用程序时有效,但VSCode的Python扩展程序给出了以下错误:

E0401:Unable to import 'models.hello'.

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

4 个答案:

答案 0 :(得分:6)

您收到的错误是由名为pylint的python linter报告的错误。所以问题并不是特定于vscode扩展。

有两种解决方案:

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

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

答案 1 :(得分:3)

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

在你的虚拟环境中使用 pylint(如果你有的话),以便 pylint 知道它。如果您的 pylint 或虚拟环境位于不同的位置,您需要调整以下内容。

  "python.linting.pylintPath": "${workspaceFolder}/api/venv/bin/pylint"

还有一个,作为 Shtefan mentions above,让 pylint 知道你项目的 Python 部分在哪里:

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

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

  "python.pythonPath": "${workspaceFolder}/api/venv/bin/python",

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

from .hello import Hello

如本主题所述:What does a . in an import statement in Python mean?

此处.表示从当前包中导入。