Python VSCode/pytest 中的 ImportError 和 ValueError

Python ImportError and ValueError in VSCode/pytest

这是我的项目的样子(过于简单):

root/
├── test/
|   └── test_code.py
└── code.py

每当我 运行 pytest 站在 root/ 我得到 ImportError : Attempted relative import with no known parent package.

如果我将 test_code.py 移动到 root/ 一切正常。但这不是一个选项,因为我有很多模块,这就是为什么我需要将所有测试模块放在一个测试文件夹中以便组织。

我正在使用 VSCode,奇怪的是:VSCode 在 test_code.py.

中找到我导入的函数

from ..code import func - 如果我右键单击 func VSCode 跳转到测试文件夹外的 code.py

当我直接在 VSCode 中尝试 运行 test_code.py 时,我得到 ValueError: attempted relative import beyond top-level package.

如何 VSCode 找到我导入的函数但不能 运行 它们并且 pytest 也不能​​ 运行 它们?

解决方案

  1. 我将 code.py 移动到 src/ 并在每个文件夹中添加了 __init__.py 文件,让 Python 知道 test/ 和 src/ 是包:
root/
├── test/
|   ├── __init__.py
|   └── test_code.py
└── src/
    ├── __init__.py
    └── code.py
  1. 我不得不在所有文件中使用 绝对 导入: from folder.file import function。了解绝对进口与相对进口 here。如果您在 root 中打开您的代码 - VSCode 现在将找到您的导入!

这就是 test_code.py 的样子:

from src.code import func

终于,运行ning pytest 成功了!如果你想从终端运行code.py,你必须运行: $ python3 -m src.code

我建议你这样尝试:

  • root中,创建一个目录src并将code.py移动到其中

  • testsrc 目录中创建一个空 __init__.py 文件

  • 在您的 test_code.py 文件中,尝试替换:

    • from ..code import func
    • from src.code import func
  • 确保 root 是当前工作目录

现在,您应该能够从 VS 代码 运行 您的脚本,并且从您的终端 运行ning pytest . 也应该可以工作。

解决方案

  1. 我将 code.py 移动到 src/ 并在每个文件夹中添加了 __init__.py 文件,让 Python 知道 test/ 和 src/ 是包:
root/
├── test/
|   ├── __init__.py
|   └── test_code.py
└── src/
    ├── __init__.py
    └── code.py
  1. 我不得不在所有文件中使用 绝对 导入: from folder.file import function。了解绝对进口与相对进口 here。如果您在 root 中打开您的代码 - VSCode 现在将找到您的导入!

这就是 test_code.py 的样子:

from src.code import func

终于,运行ning pytest 成功了!如果你想从终端运行code.py,你必须运行: $ python3 -m src.code