【发布时间】:2017-05-23 22:14:47
【问题描述】:
我正在使用 tox 和 coverage.py 在我的持续构建服务器中运行我的 Python 项目的测试。我还使用python3.5 setup.py install 安装了来自供应商(PyPI 上不可用)的包pkg_x,它放在/usr/lib/python3.5/site-packages 中。现在我需要将该包提供给测试代码。
我当前的tox.ini 看起来像这样:
[tox]
envlist = py35
[testenv]
deps = nose
coverage
commands = coverage run -m nose []
sitepackages = True
然后我像这样运行测试:
python3.5 -m tox -- --verbose --with-doctest
这非常失败 - 我的本地 setup.py 中列出的依赖包(例如 more_itertools 之类的公共内容)都找不到,即使它确实创建了像 .tox/py35/lib/python3.5/site-packages/more_itertools 这样似乎包含相关包的目录。如果我启动.tox/py35/bin/python3.5,sys.path 看起来像这样:
>>> [re.compile('.*\\.tox').sub('.tox', x) for x in sys.path]
['',
'.tox/py35/lib64/python35.zip',
'.tox/py35/lib64/python3.5',
'.tox/py35/lib64/python3.5/plat-linux',
'.tox/py35/lib64/python3.5/lib-dynload',
'/usr/lib64/python3.5',
'/usr/lib/python3.5',
'.tox/py35/lib/python3.5/site-packages']
如果我从我的tox.ini 中删除sitepackages = True 行,那么我会走得更远,在像more_itertools 这样的包中,现在可以找到我的setup.py 依赖项中的其余内容,但是供应商包pkg_x我上面提到的还是找不到。 sys.path 看起来像这样:
>>> [re.compile('.*\\.tox').sub('.tox', x) for x in sys.path]
['',
'.tox/py35/lib64/python35.zip',
'.tox/py35/lib64/python3.5',
'.tox/py35/lib64/python3.5/plat-linux',
'.tox/py35/lib64/python3.5/lib-dynload',
'/usr/lib64/python3.5',
'/usr/lib/python3.5',
'.tox/py35/lib/python3.5/site-packages',
'/usr/lib64/python3.5/site-packages',
'/usr/lib/python3.5/site-packages']
在这两种情况下,.tox/py35/ 似乎都不会在任何地方包含供应商包pkg_x。尽管在我手动启动 .tox/py35/bin/python3.5 时会列出目录 /usr/lib/python3.5/site-packages,但在运行测试时实际上并没有找到 pkg_x。
看起来sitepackages = True 的效果与它记录在案的效果相反
http://tox.readthedocs.io/en/latest/config.html#confval-sitepackages=True|False 对吧?
非常感谢您的建议!
【问题讨论】:
-
我对一个与我看到的相同的 Tox 问题发表了评论:github.com/tox-dev/tox/issues/461#issuecomment-303855697
-
tox创建它自己的虚拟环境。你对 virtualenv 有多熟悉?激活.tox目录中的venv并从那里调试。
标签: python testing coverage.py tox