VSCode 1.39.x 和 Python 3.7.x:“ImportError:尝试在没有已知父包的情况下进行相对导入” - 在没有调试的情况下启动时 (CTRL+F5))

Sha*_*ilS 7 python import package python-unittest visual-studio-code

  • 使用 CTRL+F5 从 VS Code 运行 Python 测试时,我收到错误消息

    导入错误:尝试在没有已知父包的情况下进行相对导入

错误消息文本:“ImportError:在没有已知父包的情况下尝试相对导入”

  • 使用命令行从 VS Code 终端运行 Python 测试时

    python test_HelloWorld.py

    我收到错误消息

    ValueError:尝试在顶级包中进行相对导入

错误消息:“ValueError:尝试在顶级包之外进行相对导入”

这是项目结构

项目结构

如何以最少的(代码/项目结构)更改工作解决主题问题?

蒂亚!

[更新]

我使用 sys.path 更正得到了以下解决方案:

使用sys.path更正的主题问题解决方案

import sys
from pathlib import Path
sys.path[0] = str(Path(sys.path[0]).parent)
Run Code Online (Sandbox Code Playgroud)

但我想通过使用一些(VS 代码)设置或 Python 运行上下文/环境设置(文件),仍然可以有更有效的解决方案,而无需更正源代码?

Les*_*iak 6

不要使用相对导入。只需将其更改为

from solutions import helloWorldPackage as hw
Run Code Online (Sandbox Code Playgroud)

更新

我最初在 PyCharm 中对此进行了测试。PyCharm 有一个很好的功能 - 它将内容根和源根添加到 PYTHONPATH(两个选项都是可配置的)。

您可以通过添加文件在 VS Code 中实现相同的效果.env

PYTHONPATH=.:${PYTHONPATH}
Run Code Online (Sandbox Code Playgroud)

现在,项目目录将位于通过 VS Code 启动的每个工具的 PYTHONPATH 中。现在 Ctrl+F5 可以正常工作了。

  • 我可能做错了什么 - 我添加了带有建议的 PYTHONPATH 选项的 .env 文件并更正了导入语句。仍然收到_“ModuleNotFoundError:没有名为“解决方案”的模块”_错误消息。 (3认同)
  • 谢谢您的回答。建议的代码更正会导致“ModuleNotFoundError:没有名为“解决方案”的模块”错误消息。 (2认同)

Bre*_*non 6

你遇到了两个问题。其一是您正在从其编写的目录中运行测试文件,因此 Python 不知道..代表什么。有几种方法可以解决这个问题。

一种是采用 @lesiak 提出的解决方案,将导入更改为from solutions import helloWorldPackage但通过运行 来执行测试python tests/test_helloWorld.py。这将确保您的项目的顶层位于 Python 的搜索路径中,因此它将看到solutions.

另一种解决方案是在 VS Code 的上一个目录中打开项目(无论包含solutions和 的目录tests)。不过,您仍然需要更改执行代码的方式,因此您可以按照我上面的建议从顶层执行此操作。

更好的方法是使用python -m tests.test_helloWorld、使用 Python 扩展的运行命令或使用扩展的测试资源管理器来运行代码。所有这些选项都应该帮助您了解如何运行代码(您仍然需要更改导入或在 VS Code 中打开更高的目录)。