Tox 将错误版本的 pip 安装到它的虚拟环境中

Tox installs the wrong version of pip to it's virtual env

我正在使用 tox 来管理一些测试环境。我有一个无法使用最新版本的 pip 下载的依赖项 (backports.ssl-match-hostname),因此我需要恢复到 pip 8.0.3 才能让安装工作。

我已将 8.0.3 版本的 pip 包含在我的 tox.ini 文件中作为依赖项。

deps=
    pip==8.0.3

然而,当我运行

source .tox/py27/bin/activate

并进入虚拟测试环境,然后运行

pip --version

我最后得到

8.1.2

然而,在我的 tox 环境之外,当我 运行 相同的命令时,我得到

8.0.3

tox在抓pip的时候有什么特别之处吗?为什么我无法指定我想用作依赖项的 pip 版本?

编辑:除此之外,似乎我能够获取依赖项 pip==8.0.3,但对于其他依赖项,它们仍然 运行ning 来自使用以下命令启动的命令pip==8.1.2

所以,我需要首先能够获取 pip==8.0.3,然后在安装后获取其他所有内容。仍然不确定为什么 tox 以 pip==8.1.2

开头

这显然是 "virtualenvs" python 包的结果,其中包含它引用的一组预选的 python 包,其中一个是最新最好的 pip .

我不知道这是否是执行此操作的首选方法,但我通过 运行ning

找到了成功
pip uninstall virtualenv

然后使用有效的版本重新安装

pip install virtualenv==15.0.1

使用 "correct" 版本的 virtualenv,我能够 运行 我的 tox 命令

source .tox/py27/bin/activate

并查看所需的 pip 版本

pip --version
pip 8.0.3

这里有解决方法:https://github.com/pypa/pip/issues/3666

虽然为了让它工作,我不得不在我的脚本中写 "pip install pip==8.1.1"。回顾一下:

将 pip.sh 脚本添加到您的项目:

#!/bin/bash
pip install pip==8.1.1
pip install "$@"

添加到您的tox.ini:

install_command = {toxinidir}/pip.sh {opts} {packages}

我最近遇到了这个问题。我已经有一段时间了,但它只是没有注册,因为我偶尔会遇到 Python 2/3 代码的失败。另一种可能发生这种情况的方式是,如果像我一样,您在不同 Python 版本之间更改 virtualenv 并且不清理。

检查 /bin/Scripts 以查看 python2 是否指向 python。如果 virtualenv 是 Python 3 那么这将意味着 python2 实际上调用 Python 3。反之亦然,当然,如果你的 virtualenv 是 Python 2 并且你想测试 Python 3 个代码。

新版本的 virtualenv 可以下载最新的 pipsetuptoolswheel -- 你可以在 运行 时通过 tox 禁用此行为tox-virtualenv-no-download 包见:https://github.com/asottile/tox-virtualenv-no-download#wait-why