我有一个支持python 2.4、2.6和2.7的构建框。这会导致在自己的python安装中根据需要安装各种版本的pip。我正在使用tox
通过setup.py
运行测试。
每当我运行{python2.7_installation_dir}/bin/python setup.py test
时,这都会导致.tox
目录。我在.tox
目录中运行
py27/bin/pip --version
pip 1.4.1 from {my_package}/.tox/py27/lib/python2.7/site-packages (python 2.7)
[buildbot@BUILD-SERV-01 .tox]# python2.7
Python 2.7.6 (default, Nov 20 2013, 15:33:09)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pip
>>> pip.__version__
'1.5.2'
所以.tox目录中pip的版本是1.4.1,其中为我用来执行
setup.py test
的python解释器安装的pip是1.5.2。这会在运行测试时导致错误,因为它使用pip安装目录,其中一些来自外部来源,在1.5.2中,我们需要为其中一个模块明确设置--allow-external --allow-unverified标志。在1.4.1中不存在,每次我通过tox调用测试时都会导致错误。只有一个python2.7安装,它是从源代码安装的。但我认为它运行的是pip 1.4.1,但现在已升级为使用1.5.2。如何使用旧版本的毒药?是否存在任何
.pth
文件或可能需要清除的文件?我可以删除
tox
并直接运行pytests,但我更喜欢通过tox
来运行它们。如果您想查看日志,请告诉我,我可以用日志更新问题。
最佳答案
tox
根据要测试的python版本(即基于.tox/py27
中的.tox/py35
或envlist
选项的参数)在tox.ini
和-e
等中创建virtualenv。
然后,tox
将pip
安装到此virtualenv中,并安装您的软件包以及该软件包所依赖的所有软件包。
为了节省时间,在进一步运行时,将重新使用virtualenv,并且仅重新安装您的软件包(并更新可能的依赖项)。除非您执行以下操作,否则您的pip
将保持原始版本:
./tox/py27/bin/pip install -U pip
或使用以下命令重新初始化完整的virtualenv:
tox -r -e py27
(或
tox -r
中所有python版本的.tox
virtualenvs的envlist
)。如果您还想分析
tox
如何进行设置,请首先调用:tox -r -e py27 -vv
从输出中,您可以看到重新创建步骤:
py27 recreate: /src/site-packages/your/package/.tox/py27
removing /src/site-packages/your/package/.tox/py27
setting PATH=/src/site-packages/your/package/.tox/py27/bin:/opt/python/2.7/bin:........
/src/site-packages/your/package/.tox$ python -m virtualenv --python /opt/python/2.7.13rc1/bin/python py27 >/src/site-packages/your/package/.tox/py27/log/py27-0.log
现在,您进入.tox目录,并重新创建virtualenv创建详细信息:
cd .tox; rm -rf py27
python -m virtualenv --python /opt/python/2.7/13rc1/bin/python py27
从该日志中,您将看到它使用了最新的(缓存的)
pip
版本。正常安装会为您提供最新的pip
版本,因此无需清理/更新pip
的缓存。关于python - 当安装了多个版本的python时,tox使用了错误的pip版本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21730582/