Python 包内导入和单元测试

Python intra-package imports and unit tests

我在这里和其他网站上搜索过解决方案,但感觉我遇到的所有导入问题都略有不同。

我有一个具有以下设置的项目:

在b.py中:

from .a import Foo

在测试中: import a, b

package1、package2 和 package3 本质上是较小的包,它们作为实用程序捆绑在同一个 project/super-package 中。该项目的目的是嵌套在另一个包(比如 package4)中,并让这些 packages/modules 由 package4 导入。因此,如果我不想修改路径,则需要相对导入包中的其他文件。

例如,package4:

我在上面的层次结构中省略了 __init__.py。在 main.py 中,我可能会这样做:

import src.external.project_from_above.package1.a

我的问题:这个结构工作正常,除了单元测试。我习惯于每个包(package1、package2、package3)中的 运行 python3 -m unittest discover tests。当没有相对进口时,这很好用。但是,运行 相对导入会产生以下错误:"SystemError: Parent module '' not loaded, cannot perform relative import"

我想要: 运行 在 package1 目录中 package1/tests 中进行单元测试的一种方式,没有导入更改(或者至少,保持将上述 package4 中的整个项目用作子包的能力)。我想避免对路径进行任何操作,但如果我们可以将其限制为 package1 中的 run_tests.py 文件,那就没问题了。

这是一个解决方案:在 package1 中添加一个名为 run_tests 的文件。在其中,执行以下操作:

cd ..
python -m unittest discover package1/tests

这要求您在测试中使用绝对导入(例如,import package1.a