Python内包导入和单元测试

时间:2018-02-07 23:43:33

标签: python-3.x python-import

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

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

  • /
    • __初始化__。PY
    • 包1
      • ___初始化__。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
    • 的src /
      • 外部/
        • 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:父模块''未加载,无法执行相对导入"

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

1 个答案:

答案 0 :(得分:1)

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

cd ..
python -m unittest discover package1/tests

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