我使用tox
和coverage.py
在我的连续构建服务器中运行Python项目的测试。我还有一个来自供应商的软件包pkg_x
(在PyPI上不可用),我使用python3.5 setup.py install
安装了它,它将它放在/usr/lib/python3.5/site-packages
中。现在我需要让这个包对测试代码可用。在
我当前的tox.ini
如下所示:
[tox]
envlist = py35
[testenv]
deps = nose
coverage
commands = coverage run -m nose []
sitepackages = True
我这样做测试:
^{pr2}$这非常失败-在我的本地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
。虽然当我手动启动/usr/lib/python3.5/site-packages
时,目录/usr/lib/python3.5/site-packages
被列出,但是在运行测试时,pkg_x
实际上并没有找到。在
看起来sitepackages = True
的作用与文档中的相反
http://tox.readthedocs.io/en/latest/config.html#confval-sitepackages=True|False,对吗?在
非常感谢您的建议!在
Tox
创建一个virtualenv,然后从该环境内部运行它的测试。在sitepackages
参数是一个开关,用于确定virtualenv是否可以访问全局安装的包。在运行tox的“正常”方法是简单地说
tox
;通过pip或OS包安装它应该将其放入您的路径中。即:也就是说:
^{pr2}$如果你直接调用tox,
python -m tox
,它可能会做些什么,但这对我来说是个危险信号。这个命令似乎不太可能激活相关的虚拟环境,这将解释您的包可用性问题。它之所以适合,是因为当您省略sitepackages
时,它实际上添加了全局包,因为它认为它在virtualenv中,因此添加了它认为是local
站点包,尽管它们实际上是全局的。当你做到这一点时,情况恰恰相反,因为当它寻找全局包时却找不到它们。不管怎样,因为你没有像预期的那样调用毒物,所以和我们一样困惑。在所以只需使用提供的
tox
命令。在但是等等,还有更多:您说您有一个必需的包,但在pypi上不可用。那么毒物如何安装?毒物检查医生建议了几种方法(使用要求.txt),但这里最直接的描述是激活env并手动安装它。在
如果需要进一步调试也很好:进入
.tox
目录并手动激活venv。例如:(其中
testenv
是您在tox.ini
中括号之间使用的名称)。在现在安装这个包,不管你之前是怎么做的,例如:
pip install pkg_x
用这种方法完成后,关闭venv:
现在就试试
tox
?在如果我们在正确的轨道上learn more about virtualenv here
看来我的问题的解决方案是将我的
tox.ini
中的commands
行改为:为此:
^{pr2}$其效果是,}可执行文件并运行它,结果不可预测。
python
现在是一个virtualenv映射命令,它加载正确的Python解释器,加载coverage
模块并运行它。如果没有python -m
,它只会在我的PATH
中找到任何{whitelist_externals
可以使用,但它只能解决问题。在然后,如果我还添加了
sitepackages = True
行,它将成功地看到我从供应商安装的pkg_x
,并且我的测试成功了。在相关问题 更多 >
编程相关推荐