Tox和lib以及lib64和site-packages

Ken*_*ams 6 python testing coverage.py tox

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我像这样运行测试:

python3.5 -m tox -- --verbose --with-doctest
Run Code Online (Sandbox Code Playgroud)

这失败了 - 没有找到我本地列出的依赖包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']
Run Code Online (Sandbox Code Playgroud)

如果我删除了我的sitepackages = True行tox.ini,那么我确实得到了更多,在那些包中,现在可以找到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']
Run Code Online (Sandbox Code Playgroud)

在任何情况下,.tox/py35/似乎都不包含供应商包pkg_x.虽然/usr/lib/python3.5/site-packages我.tox/py35/bin/python3.5手动启动时列出了目录,但pkg_x在运行测试时实际上并未找到.

它看起来与sitepackages = True它在http://tox.readthedocs.io/en/latest/config.html#confval-sitepackages=True|False中记录的内容有相反的效果 ,对吧?

建议非常感谢!

Joh*_*Mee 5

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

该--sitepackages参数是确定virtualenv是否可以访问全局安装的包的开关.

运行tox的"正常"方式就是简单地说tox; 通过pip或OS软件包安装它应该把它放到你的路径中.即:

$ tox
Run Code Online (Sandbox Code Playgroud)

这跟说:

$ tox -c tox.ini
Run Code Online (Sandbox Code Playgroud)

你直接调用tox的地方python -m tox,它可能会做一些事情,但这对我来说是一个红旗.此命令似乎不太可能激活相关的虚拟环境,这可以解释您的软件包可用性问题.它适合,因为当你省略时sitepackages,它实际上添加了全局包,因为它认为它在virtualenv中,所以添加,它认为是localsitepackages,虽然它们实际上是全局的.当你把它变成真的时会发生相反的情况,因为当它寻找全局包时它找不到它们.无论如何,因为你没有像预期的那样调用tox,它就像我们一样困惑.

所以只需使用tox提供的命令即可.

但是等等还有更多:你说你有一个必需的包,但在pypi上没有.那么tox如何安装呢?tox文档提出了两种方法(使用requirements.txt),但这里最直接的描述是激活env并手动安装.

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

$ source .tox/testenv/bin/activate
Run Code Online (Sandbox Code Playgroud)

(testenv您在括号中使用的名称在哪里tox.ini).

现在安装包,不过你之前做过,例如: pip install pkg_x

完成后以这种方式停用venv:

$ deactivate
Run Code Online (Sandbox Code Playgroud)

tox现在试试?

如果我们在正确的轨道上了解更多关于virtualenv的信息