【发布时间】:2018-07-18 09:58:48
【问题描述】:
我在这里和其他网站上搜索过解决方案,但感觉我遇到的所有导入问题都略有不同。
我有一个具有以下设置的项目:
- /
- __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 本质上是更小的包,它们作为实用程序捆绑在同一个项目/超级包中。该项目的目的是嵌套在另一个包(例如,package4)中,并让这些包/模块由 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 文件,那就可以了。
【问题讨论】: