在 virtualenv 中控制 pip 版本

Posted

技术标签:

【中文标题】在 virtualenv 中控制 pip 版本【英文标题】:Control the pip version in virtualenv 【发布时间】:2014-02-01 15:46:39 【问题描述】:

如何控制新创建的venv 中使用的pip 的版本?

默认情况下,它使用vendored pip distribution,它可能已过时或因任何其他原因不适合。我希望能够创建一个venv最初安装了用户指定的 pip 版本,而不是创建一个然后从环境中升级 pip 安装。

【问题讨论】:

最好是使用系统级的pip包而不是老的包,但是注意不能直接使用pip(因为它不会安装在virtualenv) 并且需要使用python -m pip 代替:1.) python -m venv .venv --without-pip --system-site-packages 2.) python -m pip install ... 【参考方案1】:

对我来说,我只是在我的机器上升级了 pip/virtualenv/virtualenvwrapper(不在 virtualenv 内)。随后创建的 virtualenvs 具有更新的版本。

deactivate
pip install --upgrade pip virtualenv virtualenvwrapper
mkvirtualenv ...

【讨论】:

谢谢。为我工作(在 Mac OSX 10.10.5 上运行 Python 2.7.11)。 只是想添加这个为我解决了这个问题,而 venv 内的 pip install --upgrade pip 不会。我遇到了 pip 9.0.1 的 ssl 问题,导致 pip 无法升级。【参考方案2】:

通过读取 virtualenv 的源代码,看起来 pip 是从 virtualenv 包含的源 tarfile 安装的。在 virtualenv 1.10.1 中,它是 site-packages/virtualenv_support 目录中的 pip-1.4.1.tar.gz(它从同一个地方获取 setuptools)。您可以替换该存档以控制版本; virtualenv.py,至少我有的版本,不在乎pip是哪个版本的:

    if not no_pip:
        install_sdist('Pip', 'pip-*.tar.gz', py_executable, search_dirs)

您也可以传递--no-pip 选项,然后从源代码安装您想要的版本。

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

【讨论】:

这在 virtualenv 1.10.1 中是正确的,但在 1.11 中它不再搜索 .tar.gz,而是从 wheel file 获取 pip。 我能够通过创建一个 pip-1.4.1 ***来实现这个想法。我将使用这些步骤编辑您的解决方案,因为我找不到任何在线下载 .whl 文件的地方。 从头开始。我所做的实际上没有用(它安装了正确的 pip 版本,但安装到了错误的位置)。所以我已经回滚了那个编辑,我仍在寻求修复:( 如果您 (@Sam Hartsfield) 发布了指向源文件的链接,那就太好了。【参考方案3】:

你不能降级 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

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

【讨论】:

您可以使用 pip 降级 pip。 @wim 如果 pip 不起作用,则不会。 pip 21 不适用于 python 3.5,但它在我创建 virtualenv 时被安装 查看 get-pip.py,它是一个巨大的二进制文件,塞进了一个 python 文件。我不知道它到底做了什么,但它看起来很可疑。 @rtaft Pip v21 首先不会为 Python 3.5 安装,因为它不受支持。无论如何,Python 3.5 现在已经报废了。 @wim 我了解它的 EOL,不幸的是现在仍然坚持下去。使用 Ubuntu 16,它仍然失败,因为 virtualenv 安装了 pip 21,即使它不支持 python 3.5,这就是为什么我去这里寻找如何修复。不应该,但确实如此。【参考方案4】:

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

pip install pip==1.4.1

【讨论】:

这仅在您当前安装的 pip 版本有效时才有效。遗憾的是,情况并非总是如此,例如在使用旧版 Python 时。 没有解决所提出的问题。关键是每次创建新的 virtualenv 时都必须这样做,这很烦人。 它没有回答问题 是的,我也遇到了同样的问题,不想每次设置新的 venv 时都安装最新的 pip【参考方案5】:

stdlib venv 模块的新增功能是 EnvBuilder.upgrade_dependencies。但是,它并没有及时进入venv 命令行界面以供 3.8.0 版本发布。

不幸的是,它不会真正帮助用户安装 特定 pip 版本,只能安装最新版本。

一切都没有丢失! venv CLI 确实提供了一个在这里很有用的 --without-pip 参数。您可以使用它来选择退出供应商 pip,然后实际使用供应商 pip 轮来安装所需的 pip 版本(以及在新创建的虚拟环境中可能需要的任何其他包)。这有点令人费解,所以最好把它放到一个 shell 函数中 - 这进入你的 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

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

.venv/bin/python $whl/pip install --upgrade pip setuptools wheel

进入这个,例如:

.venv/bin/python $whl/pip install pip==19.3.1

对于 Python 2.7 用户,您可以使用类似的技巧,因为 virtualenv--no-pip--no-setuptools--no-wheel 中提供了类似的命令行选项,并且仍然有一个供应商提供的点子轮可用于引导 @ 987654323@。 Pathlib 将不可用,因此您需要将 pathlib 用法更改为 os.path + glob

【讨论】:

【参考方案6】:

TLDR

python -m pip install --upgrade pip==<target version number>

示例

从虚拟环境中从 pip 20.3 降级到 pip 19.3

(env) $ pip --version
pip 20.3.1

(env) $ python -m pip install --upgrade pip==19.3          # downgrading
Collecting pip==19.3
  Using cached pip-19.3-py2.py3-none-any.whl (1.4 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 20.3.1
    Uninstalling pip-20.3.1:
      Successfully uninstalled pip-20.3.1
Successfully installed pip-19.3

(env) $pip --version                                                                     trex@Tobiahs-MacBook-Pro
pip 19.3 

【讨论】:

这实际上与Wolf's Jan 2014 answer 相同。 是的,它很相似,但是我觉得 upgrade 关键字实际上是 downgrade 非常违反直觉,值得明确展示。干杯。 这里不需要--upgrade 关键字。 python -m pip install pip==19.3 也一样。

以上是关于在 virtualenv 中控制 pip 版本的主要内容,如果未能解决你的问题,请参考以下文章

Python中Virtualenv和pip如何使用?

virtualenv -- python虚拟沙盒(linux版本)

设置 virtualenv:没有名为“pip”的模块

Python virtualenv 使用总结篇

virtualenv --no-site-packages 和 pip 仍在寻找全局包?

Ubuntu中Python3虚拟环境的搭建