如何在没有提供Python 2的环境中安装Pip

133 阅读4分钟

理论上,任何现代版本的 Python 2 (或 Python 3) 都与pip 捆绑在一起,尽管它可能是一个过时的版本,你可以更新它 (用类似 'python2 -m pip install --user --upgrade pip' 的东西)。 在实践中,一些 Linux 发行版将pip 分割成自己的软件包,并且不再为他们的 Python 2 版本提供这个单独的软件包。Fedora 32 绝对是这种情况,其他发行版可能很快也会这样。如果你仍然想要Pip的Python 2版本(例如,这样你就可以持续更新Python 2版本的Python语言服务器),你需要通过某种方式手工安装一个。

当我不得不在我的Fedora 32机器上这样做的时候,我很幸运,我已经在一台机器上做了Python 2 pip的更新,我用'--user'把新版本安装在我的$HOME中,所以我在.local/lib/python2.7/Site-packages中有所有的Pip代码,可以直接复制过来,还有.local/bin/pip2。事实证明,这种简单的蛮力方法可能是不必要的,有一个完全方便的替代方案,这与我开始写这篇文章前所预期的情况不同。

(因为pip通常是和你的Python一起安装的,我预计在这之外引导pip不会得到很好的支持,因为它不经常使用。不管什么原因,目前的情况完全不是这样)。

pip的人有一整个关于安装pip的文档,引导你完成一些选项。对我来说,重要的选项是用get-pip.py安装,你下载一个get-pip.py Python程序来引导pip。 它支持的选项之一是将pip作为一个用户包安装,产生一个.local/bin/pip2供你使用。需要的简单命令行是:

python2 get-pip.py --user

这样做的原因之一是,嗯,get-pip实际上就是pip本身(据我所知是完整版)。get-pip.py 开始的评论很好地解释了正在发生的事情,我只是要全盘引用它。

你好!
你可能想知道这一大团二进制数据是什么,你甚至可能担心我们在搞什么阴谋诡计(对你的妄想症有好处!)。这是一个base85编码的压缩文件,这个压缩文件包含了pip(20.2.4版)的整个副本。

Pip是一个安装软件包的东西,pip本身是一个有人可能想要安装的软件包,特别是如果他们想要运行这个get-pip.py脚本的话。Pip有很多代码来处理安装包的安全问题,各种平台上的各种边缘情况,以及其他类似的 "部落知识",这些都被编码在其代码库中。正因为如此,我们基本上在这个blob中包含了整个pip的副本。我们这样做是因为我们试图实现一个 "minipip",它可能不能正确地做事,并且有奇怪的边缘情况,或者将pip本身压缩成一个文件。

作为一个系统管理员,我完全支持这种非常直接和实用的方法来引导管道。对于一个Python程序来说,get-pip.py文件是很大的,但是作为安装程序(和可执行文件),1.9Mbytes并不算多。

然而,在不久的将来可能会出现一个问题。 很快,pip本身的版本将停止支持Python 2;官方声明(目前在这里)是。

pip 20.3是支持Python 2的最后一个版本。[...]

(目前pip的版本是20.3.3)。

预计pip 21.0的发布日期是这个月的某个时候。在那之后的某个时间,get-pip.py 可能会停止支持 Python 2,你(我)将更难在任何我还需要添加它的机器上启动 Python 2 版本的 pip。 当然,在某些时候,我也会停止对Python 2 pip的使用,因为Python语言服务器本身会放弃对Python 2的支持,我将没有任何理由去升级我的Python 2版本。

(Pip 21.0版本应该可以解决,或者至少可以解决在某些Linux配置中出现的启动时长时间停顿的问题。)

PS:PyPy将如何处理这个问题是个好问题,因为到目前为止他们计划在很长一段时间内支持Python 2。也许他们会永远冻结和运送 pip 20.3.3。