为什么你需要升级 pip
更新软件版本可以修复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)
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/
程序进展不是很顺利。
setuptools
,编译器和Python开发工具链,这将起作用,但非常慢。package
。PyArrow
也会发生相同的问题,例如:
root@1a43d55f0524:/# pip3 install pyarrow
Collecting pyarrow
Downloading https://files.pythonhosted.org/packages/62/d3/a482d8a4039bf931ed6388308f0cc0541d0cab46f0bbff7c897a74f1c576/pyarrow-3.0.0.tar.gz (682kB)
100% |################################| 686kB 1.1MB/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-heq6zwd7/pyarrow/
为什么pip试图从头开始编译这些软件包?为什么我们没有获得二进制的、预编译的软件包?
Fil
,Python内存分析器https://pythonspeed.com/products/filmemoryprofiler/
。
root@1a43d55f0524:/# pip3 install filprofiler
Collecting filprofiler
Downloading https://files.pythonhosted.org/packages/e3/a2/843e7b5f1aba27effb0146c7e564e2592bfc9344a8c8ef0d55245bd47508/filprofiler-0.7.2-cp36-cp36m-manylinux1_x86_64.whl (565kB)
100% |################################| 573kB 1.8MB/s
Installing collected packages: filprofiler
Successfully installed filprofiler-0.7.2
安装成功!除了访问Fil
的PyPI
页面(https://pypi.org/project/filprofiler/
)外,您都会看到``0.7.2`的版本很旧。在撰写本文时,Fil的最新版本是0.14.1。
pip
和manylinux
轮子NumPy
到Cryptography
的许多软件包都要求在C / C ++ / Cython / Rust / etc中编译一些代码。为了节省您从头开始编译所有内容的需要,维护人员可以将代码的编译版本(“ wheels”)上载到Python Package Index。如果pip碰到适用于您的特定版本的Python和操作系统版本的轮子,它将下载它而不是源代码。manylinux1
,manylinux2010
和manylinux2014
。您可以在下载的轮子的文件名中看到正在使用哪个变体。manylinux2010
,当然也不支持manylinux2014
。Ubuntu 18.04中的pip太旧了,因此它只了解manylinux1
。这解释了我们看到的两个问题:PyArrow 3.0.0
的可用文件列表(https://pypi.org/project/pyarrow/3.0.0/#files
),您会看到只有很多linux2010
和linux2014
的轮子。因此,pip会回退到需要编译的源代码包。Fil
的PyPI文件(https://pypi.org/project/filprofiler/0.14.1/#files
),则会看到有manylinux2010
轮子,而根本没有源程序包;因为从源代码构建有点棘手,所以我只分发编译后的程序包。这意味着pip会继续使用该软件包的较早版本,直到找到具有manylinux1
轮子的软件包为止。pip install --upgrade pip
来每天进行一次升级。pip install
来修改系统软件包。$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python3 get-pip.py
或者您可以创建一个virtualenv虚拟环境,然后通过执行pip install --upgrade pip
升级其pip:
root@1a43d55f0524:/# python3 -m venv myvenv
root@1a43d55f0524:/# . myvenv/bin/activate
(myvenv) root@1a43d55f0524:/# pip --version
pip 9.0.1 from /myvenv/lib/python3.6/site-packages (python 3.6)
(myvenv) root@1a43d55f0524:/# pip install --upgrade pip
Collecting pip
Using cached https://files.pythonhosted.org/packages/fe/ef/60d7ba03b5c442309ef42e7d69959f73aacccd0d86008362a681c4698e83/pip-21.0.1-py3-none-any.whl
Installing collected packages: pip
Found existing installation: pip 9.0.1
Uninstalling pip-9.0.1:
Successfully uninstalled pip-9.0.1
Successfully installed pip-21.0.1
现在,我们有了一个更新后的pip
,我们可以轻松地安装最新版本的cryptography
和filprofiler
:
(myvenv) root@1a43d55f0524:/# pip install cryptography filprofiler
Collecting cryptography
Downloading cryptography-3.4.6-cp36-abi3-manylinux2014_x86_64.whl (3.2 MB)
|################################| 3.2 MB 4.5 MB/s
...
Installing collected packages: pycparser, threadpoolctl, cffi, filprofiler, cryptography
Successfully installed cffi-1.14.5 cryptography-3.4.6 filprofiler-0.14.1 pycparser-2.20 threadpoolctl-2.1.0
注意,我们下载了包含cryptography
的manylinux2014
软件包。
glibc
)。您可以使用ldd
实用工具查看可执行文件或共享库链接到哪些库:
root@1a43d55f0524:/# cd myenv/lib/python3.6/site-packages
root@1a43d55f0524:/# ldd cryptography/hazmat/bindings/_openssl.abi3.so
linux-vdso.so.1 (0x00007ffdbea7b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fba7b1bf000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fba7adce000)
/lib64/ld-linux-x86-64.so.2 (0x00007fba7b7b0000)
注意,编译后的Python扩展尤其依赖于/lib/x86_64-linux-gnu/libc.so.6
,即glibc
。
glibc
的较新版本编译代码,它可能不需要在旧版本提供新的API或符号。这意味着你的代码不会在旧的Linux发行版上运行。Conda
通过针对旧版本的glibc
头文件来编译所有的包;基本上在广泛的Linux发行版它有一个自定义编译安装设计工作。glibc
来解决这个问题。因为它是针对旧版本编译的,它会与任何新版本兼容工作。
manylinux1
包建在CentOS 5。manylinux2010
包建在CentOS 6。manylinux2014
软件包都建立在CentOS 7上。
每个新版本都需要对应的新发布的pip。你可以学到更多的PEP-571
和PEP-599
。
Dockerfile
,请确保升级pip。否则,你就会有一个更难的时间安装软件包。为什么你需要升级 pip的更多相关文章
- 安装 SciPy 和 scikit-learn 升级pip 及pip基本命令表
安装Scipy和scikit-learn出错,出错记录及当时最终解决办法 问题: 一.使用pip直接安装 直接pip install scipy C:\Users\Plain>pip insta ...
- 升级 pip版本
安装第三方库:pip install Pillow 出现 You are using pip version 7.1.2, however version 9.0.1 is available. Yo ...
- 升级 pip 超时解决方案
安装的时候发现报错如下, 提示需要升级pip 按照指引进行升级, 同样的超时 使用 豆瓣源进行安装 pip python -m pip install --upgrade pip -ihttp://p ...
- Linux安装/升级pip
Linux安装/升级pip 1.执行脚本 # wget https://bootstrap.pypa.io/get-pip.py # 如果没有 wget,先安装 wget # yum -y insta ...
- ubuntu升级pip后, ImportError: cannot import name ‘main‘
场景描述: 原先pip安装完成之后,一直没有更新版本,原pip版本为8.1.1,今天安装python 包pysftp的时候,提示需要升级pip到(pip 10.0.1); 于是乎,直接手到擒来,终端命 ...
- linux--解决anaconda升级pip问题
Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项. 在用pip install命令安装东西时,有时会提示如下错误:升级pip You ...
- Mac下Pycharm中升级pip失败,通过终端升级pip
使用 Pycharm 使,需要下载相关的第三方包,结果提示安装失败,提示要升级 pip 版本,但是通过 Pycharm 重新安装却失败,原因可能是出在通过 Pycharm 时升级 pip 是没有权限的 ...
- 升级pip后,出现ImportError:cannot import name main
升级pip后,出现ImportError错误,如下图: 解决方法: sudo gedit /usr/bin/pip 进去后修改为 from pip import __main__ if __name_ ...
- mac安装pip并升级pip版本
最近想安装inchat,直接使用命令pip install install,结果提示 使用提示中的命令升级,结果提示找不到pip.很郁闷,明明有pip,结果一升级还给升没了.最后用的是这个方法完美 ...
- Linux系统中如何升级pip
问题提出:在Linux系统下安装python的logging库时提示以下信息 经过一番折腾,定位在pip版本过低和setuptools版本过低上 一.Linux下更新包 sudo python3 -m ...
随机推荐
- 详解 C++ 左值、右值、左值引用以及右值引用
一.左值和右值 1.左值 [可以取地址的对象就是左值] 左值是一个表示数据的表达式,比如:变量名.解引用的指针变量.一般地,我们可以获取它的地址和对它赋值,但被 const 修饰后的左值,不能给它赋值 ...
- nginx 日志分析之 access.log 格式详解
说明:access.log 的格式是可以自己自定义,输出的信息格式在nginx.conf中设置 一般默认配置如下: http { ... log_format main '$remote_addr - ...
- Qt学习笔记(一) 关于QWidget类的paintEvent方法
今天要讨论的也算是QT的核心之一了,那就是如何对widget进行重绘,这里就是可以看到,继承了QWidget的子类,自己重新写一个paintEvent函数就可以了. 这个paintEvent就相当于是 ...
- sqoop,hive2mysql
sqoop export \ --connect jdbc:mysql://master:3306/testdb \ --username hive \ --password 123456 \ --t ...
- ERROR 1862 (HY000): Your password has expired. To log in you must change it using a .....
navcat 登录本地失败 https://blog.csdn.net/fenniang16/article/details/81216602?spm=1001.2101.3001.6661.1&am ...
- printf函数size_t的替换字符串zu
参考:https://stackoverflow.com/questions/2524611/how-can-one-print-a-size-t-variable-portably-using-th ...
- Uri转绝对路径工具类
/** * 反射从 provider uri中获取 文件绝对路径 * @param context * @param uri * @return */ private static String ge ...
- Github的.gitignore忽略文件
Git中有一个非常重要的一个文件-----.gitignore 1.当然如果已经push了怎么办?当然也有解决方法,如下: 有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述 ...
- 【读书笔记】Linux系统管理初学者指南读书笔记1——第1-2章
本博客记录一下<Linux系统管理初学者指南>这本书的读书笔记,最近由于想做一些关于嵌入式的项目,所以需要对Linux系统进行学习,正好之前买过这本书,内容还可以,能作为入门阅读 第1章 ...
- python中的import、from import以及import as的区别
import import是python提供的用于导入模块的机制,导入的是整个模块的内容.模块可以是py.pyc.pyd,可以是系统自带的,也可以是自定义的. 使用语法:import os pytho ...