【问题标题】:Python intra-package imports and unit testsPython 包内导入和单元测试
【发布时间】: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

我在上面的层次结构中省略了 __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 文件,那就可以了。

【问题讨论】:

    标签: python-3.x python-import


    【解决方案1】:

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

    cd ..
    python -m unittest discover package1/tests
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-08
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 2016-01-25
      • 2020-04-16
      • 2013-12-16
      相关资源
      最近更新 更多