控制virtualenv中的pip版本

wim*_*wim 22 python pip virtualenv virtualenvwrapper python-wheel

如何控制pip新创建的virtualenv中使用的版本?我相信我已经从操作系统中消除了所有其他版本的pip,但仍然mkvirtualenv从某个地方获得了一个pip-1.5!我希望它在virtualenv中使用pip 1.4.1.

__PRE__

KFu*_*unk 15

对我来说,我刚刚在我的机器上升级了pip/virtualenv/virtualenvwrapper(不在virtualenv中).随后创建的virtualenvs有更新版本.

deactivate
pip install --upgrade pip virtualenv virtualenvwrapper
mkvirtualenv ...
Run Code Online (Sandbox Code Playgroud)


Sam*_*eld 13

从阅读virtualenv的源代码看,pip是从virtualenv中包含的源tarfile安装的.在virtualenv 1.10.1中,它pip-1.4.1.tar.gz位于site-packages/virtualenv_support目录中(它setuptools来自同一个地方).您可以切实地替换该存档来控制版本; virtualenv.py,至少我的版本,并不关心哪个版本的pip存在:

    if not no_pip:
        install_sdist('Pip', 'pip-*.tar.gz', py_executable, search_dirs)
Run Code Online (Sandbox Code Playgroud)

您也可以传递该--no-pip选项,然后从源代码安装所需的版本.

在virtualenv 1.11中,它查找一个wheel文件(例如pip-*.whl)而不是a tar.gz,但除此之外它的行为方式相同(感谢@wim进行更新).


blu*_*Cat 10

您不能使用 pip降级pip,解决方案是在您的虚拟环境中安装特定版本:

virtualenv env -p python3.6 --no-pip
source env/bin/activate
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py pip==18.1
Run Code Online (Sandbox Code Playgroud)

这将允许您继续使用--process-dependency-links在 pip 19 中删除的内容。

  • @wim 我了解它的 EOL,不幸的是现在仍然坚持下去。在 Ubuntu 16 中,它仍然失败,因为 virtualenv 安装了 pip 21,尽管 python 3.5 不支持它,这就是我在这里寻找如何修复的原因。不应该,但确实如此。 (2认同)

Wol*_*olf 5

替换安装在虚拟环境中的 pip 很容易。在您的虚拟环境活动中,只需执行以下命令:

pip install pip==1.4.1
Run Code Online (Sandbox Code Playgroud)

  • 这仅在您当前安装的 pip 版本有效时才有效。遗憾的是,情况并非总是如此,例如在使用旧版 Python 时。 (3认同)

wim*_*wim 2

自 Python 3.9 起,stdlibvenv模块具有EnvBuilder.upgrade_dependencies. 不幸的是,它有两个缺点:

  • 不会真正帮助用户安装特定的pip 版本,只能安装最新的。
  • 它仍然首先安装供应商的 pip 和 setuptools 版本,然后在它们过时时将其卸载,这在实践中几乎总是如此。

最好直接安装最新版本!CLIvenv提供了一个--without-pip在这里有用的参数。您可以使用它来选择退出供应商的 pip,然后实际使用供应商的 pip 轮来安装您所需的 pip 版本(以及您在新创建的虚拟环境中可能需要的任何其他软件包)。

最好将其放入一个函数中 - 这会放入您的 shell 配置文件或 rc 文件中:

function ve() {
    local py="python3"
    if [ ! -d ./.venv ]; then
        echo "creating venv..."
        if ! $py -m venv .venv --prompt=$(basename $PWD) --without-pip; then
            echo "ERROR: Problem creating venv" >&2
            return 1
        else
            local whl=$($py -c "import pathlib, ensurepip; [whl] = pathlib.Path(ensurepip.__path__[0]).glob('_bundled/pip*.whl'); print(whl)")
            echo "boostrapping pip using $whl"
            .venv/bin/python $whl/pip install --upgrade pip setuptools wheel
            source .venv/bin/activate
        fi
    else
        source .venv/bin/activate
    fi
}
Run Code Online (Sandbox Code Playgroud)

正如所写的,这个函数只是从索引中提取最新的pip、、setuptoolswheel。要强制使用特定版本,您只需更改 shell 脚本的这一行:

.venv/bin/python $whl/pip install --upgrade pip setuptools wheel
Run Code Online (Sandbox Code Playgroud)

以此为例:

.venv/bin/python $whl/pip install pip==19.3.1
Run Code Online (Sandbox Code Playgroud)

对于 Python 2.7 用户,您可以执行类似的技巧,因为在、和virtualenv中提供了类似的命令行选项,并且自 Python 2.7.9 以来仍然有一个供应商的 pip 轮可用于引导。Pathlib 将不可用,因此您需要将用法更改为+ 。--no-pip--no-setuptools--no-wheelpathlibos.pathglob