【发布时间】:2016-08-24 23:58:30
【问题描述】:
这个问题是由python guide 中关于将项目添加到 sys 路径以在测试中使用的说明引起的,除非我误解了说明,否则这似乎不起作用
我有一个这样的 python 项目的目录结构
sample/a.py
sample/b.py
sample/c.py
sample/__init__.py
test/context.py
test/test_something.py
test/__init__.py
docs
根据the python guide,我应该创建一个test/context.py文件并添加这个
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
import sample
然后,在我的test/test_something.py 文件中,它说我可以这样做
from .context import sample
指南说“这将始终按预期工作”。
但是,当我 cd 进入测试并运行时
python -m unittest test_something
我收到一个错误
ValueError: Attempted relative import in non-package
而错误信息具体指的是这个:from .context import sample
问题:如何正确地将示例包添加到 sys 路径?
在回答时,您能否澄清一下解决方案是否会处理示例包中的绝对导入。例如,我的 sample.a 导入 sample.b 等。当我以不同的方式构建测试时,我对 sample.a 进行了绝对导入,但由于它的相对导入为 from .b import Boo,因此产生了类似的错误
更新
`File "/usr/local/lib/python2.7/runpy.py", line 162 in _run_module_as_main "__main__", fname, loader, pkg_name)
File "/usr/local/lib/python2.7/runpy.py", line 72, in _run_code exec code in run_globals
File "/usr/local/lib/python2.7/unittest/__main__.py", line 12, in module main(module=None)
File "/usr/local/lib/python2.7/unittest/main.py", line 94, in __init__ self.parseArgs(argv)
File "/usr/local/lib/python2.7/unittest/main.py", line 149 in parseArgs self.createTests()
File "/usr/local/lib/python2.7/unittest/main.py", line 158, in createTests self.module)
File "/usr/local/lib/python2.7/unittest/loader.py", line 130, in loadTestsFromNames suites = [self.loadTestsFromName(name,module) for name in names]
File "/usr/local/lib/python2.7/unittest/loader.py", line 91, in loadTestsFromName module = __import__('-'.join(parts_copy))
File "test_something.py", line 8, in module from .context import sample
更新
如果我从根目录运行以下命令
python -m unittest test
它说,“在 0.000 秒内运行 0 次测试”
如果按照 @cuongnv 在 cmets 中的建议,我从根目录运行它
python -m unittest test/test_something.py
或者这个(没有文件扩展名)
python -m unittest test/test_something
它说“不支持按文件名导入”
【问题讨论】:
-
你用的是什么版本的python?可以肯定的是,python 3 对相关导入进行了重新设计
-
呃,好的;那么,您可以发布完整的回溯吗?以及
__init__.py两个文件的内容? -
我添加了堆栈跟踪。谢谢你。另外,为了回答 @DarthVader 的问题,我使用的是 python 2,但也让应用程序在 python 3 上运行,所以我还在示例文件夹中每个文件的顶部使用
from __future__ import absolute_import -
@Leahcim 如果您注释掉
__future__导入,它有效吗? -
@cuongnv 我已经发布了 test_something.py 中的相关行,即
from .context import sample,这是链接到 python 指南所说的内容,也是触发错误的原因。不幸的是,我删除了文件的其余部分,因为我找到了一种通过在测试目录之外使用 run_tests.py 文件(文件名显然无关紧要)来运行测试的方法。但是,我留下了这个问题,因为它显示的问题没有得到回答(并且指南说它应该可以工作)。但我认为 test_something.py 文件的其余部分只是一个基本的测试用例
标签: python