Python中使用unittest的相对导入

Python中使用unittest的相对导入,python,python-import,python-unittest,Python,Python Import,Python Unittest,我试图使用Python unittest和相对导入,但我似乎无法理解。我知道有很多相关的问题,但到目前为止,没有一个能帮上忙。对不起,如果这是重复,但我真的很感谢任何帮助。我试图使用PEP 328中的语法,但一定是出了什么问题 我的目录结构是: project/ __init__.py main_program.py lib/ __init__.py lib_a lib_b tests/ __init

我试图使用Python unittest和相对导入,但我似乎无法理解。我知道有很多相关的问题,但到目前为止,没有一个能帮上忙。对不起,如果这是重复,但我真的很感谢任何帮助。我试图使用PEP 328中的语法,但一定是出了什么问题

我的目录结构是:

project/
    __init__.py
    main_program.py
    lib/
        __init__.py
        lib_a
        lib_b
    tests/
        __init__.py
        test_a
        test_b
我使用以下方法运行测试:

python -m unittest test_module1 test_module2
test_a需要同时导入lib/lib_a和main_程序。这是我尝试用于导入的test_a中的代码:

from ..lib import lib_a as lib
from ...project import main_program
两者都会引发此错误:

ValueError: Attempted relative import in non-package
ValueError: Attempted relative import beyond toplevel package
我的所有init.py文件当前都为空

如有任何具体建议,将不胜感激

编辑:

这可能就是答案: 我还在验证这是否有效

编辑二:

为了澄清这一点,我尝试以3种不同的方式运行我的测试文件:

project/tests $ python -m unittest test_a
project/tests $ python -m test_a
project/tests $ ./test_a
所有三个都失败,错误与上述相同。当我在项目目录中使用相同的三个语法时,会出现以下错误:

ValueError: Attempted relative import in non-package
ValueError: Attempted relative import beyond toplevel package

再次感谢

根据我的经验,如果您的项目根不是一个包,那么这是最简单的,如下所示:

project/
  test.py
  run.py
  package/
    __init__.py
    main_program.py
    lib/
      __init__.py
      lib_a
      lib_b
    tests/
      __init__.py
      test_a
      test_b
但是,从python 3.2开始,unittest模块提供了
-t
选项,它允许您设置顶级目录,因此您可以(从
package/
)执行以下操作:


更多详情请参见。

我遇到了同样的问题,kai的回答解决了这个问题。我只想用
test.py
(正如@gsanta所问)的内容来补充他的答案。我只在Python 2.7上测试过它:

from packages.tests import test_a, test_b
import unittest

# for test_a
unittest.main(test_a, exit=False)

# for test_b
unittest.main(test_b)
那你就可以

../project $ python test.py
在测试和包处于兄弟级别的布局中:

/project
   /tests
   /package
一种方法是从包目录开始,使用-s仅在测试中发现,并使用-t设置顶级:

../package $ python3 -m unittest discover -s ../tests -t ..


“请注意,虽然最后一个案例[…]是合法的,但它肯定是不被鼓励的(“疯狂”是Guido一词)。”-PEP328尝试将其作为一个包调用。。。我需要通过unittest运行它,所以我认为这不会起作用。当我运行这个命令:“python-m tests.test_a”时,我得到了一个错误:“ValueError:试图在顶级包之外进行相对导入”。我想你可以链接
-m
?检查什么是相对进口?蟒蛇?当前目录?什么?我只是接受guido的观点,很少使用它们。如果您的测试正在测试lib模块,则将它们与它们正在测试的例程一起放入lib中。只有测试项目的测试才属于顶层。谢谢!这确实有帮助。我还从Mark Lutz的“学习Python”中的模块部分获益匪浅。我意识到我需要确保导入从实际调用模块的目录而不是模块所在的目录正确工作。所以,现在我从project/调用我的测试文件,测试_a中的导入内容是:“import lib.lib_a”和“import spd”。这与从更高级别目录运行unittests的简单方法相结合,使我能够修复代码。test.py包含什么?在本例中,它将是一个运行测试的可执行文件(类似于
unittest.main()
,设置你的
sys.path
或任何需要的东西-这对于简单的事情来说并不重要。“test_a”和“test_b”包含什么?它们如何导入“lib_a”和“lib_b”的内容进行测试?正如@JJones所提到的,Mark Lutz的“Learning Python”非常好地解释了模块导入过程。高度推荐ded阅读。如果测试a的结构也存在,我会对此进行投票