python - 如何将包添加到系统路径进行测试

标签 python

这个问题是由 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 是一个列表,您可以使用列表的其他方法,如 insertappend...

在您的例子中,您将在路径列表的顶部插入上层目录。

参见:

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/

相关文章:

python - 限制Python输入为int

python - 检索 ttk.Treeview 项目的 'open' 选项作为 bool 值

python - 用python遍历一个ftp文件夹

python3 linux - 检测没有root按下的键盘键

python - 使用 twisted 检查 IRC channel 中的用户是 'voiced' 还是 'op'

python - 当坐标保存在对象中时,使用 python 中的 kd-tree 查找 k 个最近邻

python - 如何使用限制性数据集在我自己和其他人之间创建 Keras 人脸分类器?

python - 控制Python数据类继承类时的初始化顺序

python - PySide:QTreeView 到嵌套字典

python - 尝试访问 python 函数时出现 AttributeError