更新软件版本可以修复bug,增加新功能和提升性能。例如,NumPy 1.20 添加了类型注释,并在可能的情况下通过使用SIMD来提高性能。如果您要安装NumPy,则可能要安装最新版本。
相反,如果您使用的是旧版本的pip,则安装最新版本的Python软件包可能会失败,或者以较慢,更复杂的方式进行安装。
为什么?这是关于glibc版本控制以及pip如何安装软件包的一系列问题。
让我们看看问题到底是什么,如何解决,最后是什么原因造成的。
旧版本pip的问题
让我们从Ubuntu 18.04 Docker镜像开始着手。该版本的Ubuntu在2018年4月发布,安装有Python 3.6和pip 9 版本。
[itamarst@blake dev]$ docker run -it ubuntu:18.04
root@1a43d55f0524:/# apt-get update
...
root@1a43d55f0524:/# apt-get install --no-install-recommends python3 python3-pip
...
root@1a43d55f0524:/# pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
目前为止,事情进展顺利。
失败原因#1:从源代码编译
接下来,让我们安装加密程序包,它是PyPI上下载次数最多的Python程序包之一,每月有数百万次下载(通常是间接依赖)。
root@1a43d55f0524:/# pip3 install cryptography
Collecting cryptography
Downloading https://files.pythonhosted.org/packages/fa/2d/2154d8cb773064570f48ec0b60258a4522490fcb115a6c7c9423482ca993/cryptography-3.4.6.tar.gz (546kB)
100% |################################| 552kB 1.4MB/s
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'setuptools'
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-6jesygn0/cryptography/
程序进展不是很顺利。
这个错误意味着pip要我们编译软件包;如果我们安装了setuptools
,编译器和Python开发工具链,这将起作用,但非常慢。
当然,这不只是一个package
。PyArrow
也会发生相同的问题&#x