Tox和lib,lib64和sitepackages

2024-04-20 01:18:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用toxcoverage.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.5sys.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,对吗?在

非常感谢您的建议!在


Tags: pathpytruetoxlibpackagesusrsys
2条回答

Tox创建一个virtualenv,然后从该环境内部运行它的测试。在

sitepackages参数是一个开关,用于确定virtualenv是否可以访问全局安装的包。在

运行tox的“正常”方法是简单地说tox;通过pip或OS包安装它应该将其放入您的路径中。即:

$ tox

也就是说:

^{pr2}$

如果你直接调用tox,python -m tox,它可能会做些什么,但这对我来说是个危险信号。这个命令似乎不太可能激活相关的虚拟环境,这将解释您的包可用性问题。它之所以适合,是因为当您省略sitepackages时,它实际上添加了全局包,因为它认为它在virtualenv中,因此添加了它认为是local站点包,尽管它们实际上是全局的。当你做到这一点时,情况恰恰相反,因为当它寻找全局包时却找不到它们。不管怎样,因为你没有像预期的那样调用毒物,所以和我们一样困惑。在

所以只需使用提供的tox命令。在

但是等等,还有更多:您说您有一个必需的包,但在pypi上不可用。那么毒物如何安装?毒物检查医生建议了几种方法(使用要求.txt),但这里最直接的描述是激活env并手动安装它。在

如果需要进一步调试也很好:进入.tox目录并手动激活venv。例如:

$ source .tox/testenv/bin/activate

(其中testenv是您在tox.ini中括号之间使用的名称)。在

现在安装这个包,不管你之前是怎么做的,例如:pip install pkg_x

用这种方法完成后,关闭venv:

$ deactivate

现在就试试tox?在

如果我们在正确的轨道上learn more about virtualenv here

看来我的问题的解决方案是将我的tox.ini中的commands行改为:

commands = coverage run -m nose []

为此:

^{pr2}$

其效果是,python现在是一个virtualenv映射命令,它加载正确的Python解释器,加载coverage模块并运行它。如果没有python -m,它只会在我的PATH中找到任何{}可执行文件并运行它,结果不可预测。whitelist_externals可以使用,但它只能解决问题。在

然后,如果我还添加了sitepackages = True行,它将成功地看到我从供应商安装的pkg_x,并且我的测试成功了。在

相关问题 更多 >