我有一个支持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/py35envlist选项的参数)在tox.ini-e等中创建virtualenv。
然后,toxpip安装到此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/

10-12 18:39