这个问题是由 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 评论中的建议,我从根目录运行它
python -m unittest test/test_something.py
或者这个(没有文件扩展名)
python -m unittest test/test_something
它说“不支持按文件名导入”
最佳答案
Question: How can I add my sample package to the sys path correctly?
您的做法是正确的,但是您没有将文件夹声明为包。尝试 Christian 的解决方案,它应该有效。
您的路径存储在 sys.path
中。通过这样做:
sys.path.insert(0, os.path.abspath('..'))
你告诉你的 python 将(当前文件的)上层文件夹添加到你的路径中。由于 sys.path
是一个列表,您可以使用列表的其他方法,如 insert
、append
...
在您的例子中,您将在路径列表的顶部插入上层目录。
参见:
In [1]: import sys
In [2]: sys.path
Out[2]:
['',
'/usr/local/bin',
'/usr/lib/python3.4',
'/usr/lib/python3.4/plat-x86_64-linux-gnu',
'/usr/lib/python3.4/lib-dynload',
'/usr/local/lib/python3.4/dist-packages',
'/usr/lib/python3/dist-packages',
'/usr/local/lib/python3.4/dist-packages/IPython/extensions',
'/home/cuong/.ipython']
In [3]: sys.path.insert(0, '/tmp/foo')
In [4]: sys.path
Out[4]:
['/tmp/foo', **<-- on top**
'',
'/usr/local/bin',
'/usr/lib/python3.4',
'/usr/lib/python3.4/plat-x86_64-linux-gnu',
'/usr/lib/python3.4/lib-dynload',
'/usr/local/lib/python3.4/dist-packages',
'/usr/lib/python3/dist-packages',
'/usr/local/lib/python3.4/dist-packages/IPython/extensions',
'/home/cuong/.ipython']
所以,从这里开始,当您拥有
import sample
你的 python 将尝试在路径中查找是否有任何 sample
包。
不幸的是,它找不到 sample
因为你没有把它作为一个包,因为你忘记了 sample
中的 __init__.py
文件夹。
希望我的解释能帮助您理解,并能处理与此不同的其他情况。
关于python - 如何将包添加到系统路径进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39134718/