我的项目结构如下:
.
└── myapp
├── app.py
├── models
│ ├── hello.py
│ └── world.py
└── requirements.txt
我有两个模型,hello
和world
。这两个模型都在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中避免此错误?
答案 0 :(得分:6)
您收到的错误是由名为pylint
的python linter报告的错误。所以问题并不是特定于vscode扩展。
有两种解决方案:
请尝试使用vape .env
在项目目录中添加PYTHONPATH=./myapp
文件,这将告诉pylint在哪里找到您的模块
或者直接在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?
此处.
表示从当前包中导入。