【问题标题】:Control the pip version in virtualenv在 virtualenv 中控制 pip 版本
【发布时间】: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 ...

标签: python pip virtualenv python-wheel python-venv


【解决方案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 也一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    相关资源
    最近更新 更多