在 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 的更新)。
【讨论】:
这在 virtualenv1.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
正如所写,此函数仅从索引中提取最新的pip
、setuptools
和wheel
。要强制使用特定版本,您只需更改 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 版本的主要内容,如果未能解决你的问题,请参考以下文章
virtualenv -- python虚拟沙盒(linux版本)