【问题标题】:Proper relative imports: "Unable to import module"正确的相对导入:“无法导入模块”
【发布时间】:2018-08-05 00:54:52
【问题描述】:

我的项目结构如下:

.
└── 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 中避免此错误?

【问题讨论】:

  • 希望您的所有模块中都有 init 文件。

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


【解决方案1】:

在您的.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】:

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

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

    【讨论】:

    • 我对每个项目都有一个 venv。哪条绝对路径是精神?
    • 我不使用 venv。但是根据文档,您可以尝试使用这些参数:sys.prefix 和 sys.exec_prefix。 docs.python.org/3/library/venv.html
    • 另一个选项只是切换到不同的 linter。最近我开始使用 flake8,到目前为止完全没有问题。
    • 我一直在寻找几个小时,这解决了它!谢谢!
    • 使用 from models.hello import Hello 有什么问题?是否对错误有任何解释,还是 vs 扩展无法正确理解导入?
    【解决方案3】:

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

    有两种解决方案:

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

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

    【讨论】:

    • 使用 .env 文件解决了我遇到的 VS Code 无法 ctrl+单击导航到导入的本地类的问题。谢谢!
    • 我似乎太愚蠢了。您能否更具体地举一个例子并参考venv?我也没有得到 myapp 的定义。谢谢
    • @Christian 您在项目的根目录下创建了一个.env 文件,并在其中放入变量PYTHONPATH=path_to_your_package。在作者的例子中,从根目录到包的路径是./myapp,所以他需要在env文件中放入变量PYTHONPATH=./myapp
    【解决方案4】:

    由于 hello.pyworld.py 在同一个文件夹(又名包)中,您应该在 world.py 中导入 Hello 类强>如下:

    from .hello import Hello
    

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

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

    【讨论】:

    • 这解决了 vscode 错误购买中断应用程序。 app.py 是应用程序的入口点,所以即使在 world.py 我也无法从 hello 导入,因为 hellohello b>models 而不是项目根目录。我得到no module named 'hello'
    • @JimmySanchez 你是对的,我已经更新了我的答案。应该是from .hello import Hello
    • 使用from models.hello import Hello有什么问题?是否对错误有任何解释,还是 vs 扩展无法正确理解导入?
    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2016-03-04
    • 2023-03-28
    • 2020-01-10
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多