Python 包内导入和单元测试
Python intra-package imports and unit tests
我在这里和其他网站上搜索过解决方案,但感觉我遇到的所有导入问题都略有不同。
我有一个具有以下设置的项目:
- /
- __init__.py
- 包1
- ___init__.py
- a.py
- b.py
- 测试/
- test_a.py
- test_a.py
- 包2
- 包3
在b.py中:
from .a import Foo
在测试中:
import a, b
package1、package2 和 package3 本质上是较小的包,它们作为实用程序捆绑在同一个 project/super-package 中。该项目的目的是嵌套在另一个包(比如 package4)中,并让这些 packages/modules 由 package4 导入。因此,如果我不想修改路径,则需要相对导入包中的其他文件。
例如,package4:
- /
- main.py
- 源/
- 外部/
- project_from_above
- 包1
- 包2
- 包3
我在上面的层次结构中省略了 __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
)
我在这里和其他网站上搜索过解决方案,但感觉我遇到的所有导入问题都略有不同。
我有一个具有以下设置的项目:
- /
- __init__.py
- 包1
- ___init__.py
- a.py
- b.py
- 测试/
- test_a.py
- test_a.py
- 包2
- 包3
在b.py中:
from .a import Foo
在测试中:
import a, b
package1、package2 和 package3 本质上是较小的包,它们作为实用程序捆绑在同一个 project/super-package 中。该项目的目的是嵌套在另一个包(比如 package4)中,并让这些 packages/modules 由 package4 导入。因此,如果我不想修改路径,则需要相对导入包中的其他文件。
例如,package4:
- /
- main.py
- 源/
- 外部/
- project_from_above
- 包1
- 包2
- 包3
- project_from_above
- 外部/
我在上面的层次结构中省略了 __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
)