目录

  • 前言
  • 一、初探pip安装过程
  • 二、包的发行版(Distribution)
    • 2.1. 什么是发行包?(Distribution Package)
    • 2.2. 什么是源发行版?(Source Distribution/sdist)
    • 2.3. 什么是已编译的发行版?(Built Distribution)
      • 2.3.1 用户角度
      • 2.3.2 开发者角度
  • 三、wheel(.whl)包到底是什么
  • 四、wheel包的好处
  • 总结
  • 参考资料

前言

学习Python的人一定知道pip install xxx的作用,但是很少有人会去想背后的东西——pip安装的到底是什么?什么是.whl包?如果哪天我自己想写一个python包,应该怎么做?


一、初探pip安装过程

我们先来看两个pip安装包的过程。第一个是再熟悉不过的NumPy包:

$ pip install numpy
Collecting numpyDownloading numpy-1.19.4-cp36-cp36m-manylinux2010_x86_64.whl (14.5 MB)|████████████████████████████████| 14.5 MB 15.1 MB/s
Installing collected packages: numpy
Successfully installed numpy-1.19.4

一个是uWSGI包(用来做什么的不用管)

$ pip install uwsgi
Collecting uwsgiDownloading uWSGI-2.0.19.1.tar.gz (803 kB)|████████████████████████████████| 803 kB 274 kB/s
Building wheels for collected packages: uwsgiBuilding wheel for uwsgi (setup.py) ... doneCreated wheel for uwsgi: filename=uWSGI-2.0.19.1-cp36-cp36m-linux_x86_64.whl size=597269 sha256=f2289db3db6d625f136f794be0319da477ad740eb28cd063971f8d335327c09cStored in directory: /private/.cache/pip/wheels/3a/7a/c1/492f02e0cde1e39f8b75c79dc5ef3b7e2c93b02e3a7eaabe0c
Successfully built uwsgi
Installing collected packages: uwsgi
Successfully installed uwsgi-2.0.19.1

细看会发现:

  1. NumPy下载的是以whl格式结尾的东西,而uWSGI则是下了tar.gz的压缩包;
  2. uWSGI多了一些build的过程,在build结束之后才开始install。

了解了这些区别之后,我们再来铺垫一点发行版的内容。


二、包的发行版(Distribution)

2.1. 什么是发行包?(Distribution Package)

发行包,说得直白一点就是端用户(比如一个刚开始学Python的小白)下载的东西。一个发行包包含了模组、资源文件等等。用户们下载好发行包就能直接安装使用了。

2.2. 什么是源发行版?(Source Distribution/sdist)

源发行版,顾名思义就是“发行的是源码”,包含了元数据和源码文件(Python, C++等),必须要经过编译才能使用起来。编译的过程是在用户的机子上进行的。通常用python setup.py sdist来产生源发行版。

2.3. 什么是已编译的发行版?(Built Distribution)

同样地,如果源码被编译好了,那就成了一个已编译的发行版了。我们要谈到的wheel就是已编译发行版的一种格式。有的地方提到二进制发行版(binary distribution)也基本默认是wheel包。(下文如果提到wheel或二进制发行版就默认是已编译发行版了)

所以,结合上面的例子,我们大概可以猜出来NumPyuWSGI安装上的区别了:NumPy下载的是已编译的发行版,而uWSGI下载的是源发行版,在本地编译完了之后才执行安装。

所以为什么有的包直接提供了wheel,有些包要提供源码呢?

2.3.1 用户角度

从用户的角度看,wheel包显然就是方便的代名词。能用wheel的时候我们尽量就不要去用别的安装方式了,免得给自己找麻烦。

为了体现使用whl包到底比源码包快多少,我们可以尝试下面两种不同的过程来安装NumPy

# 使用源码包安装,即便有PyPi上有whl包可以使用
# --no-cache-dir:不适用本地缓存,始终从PyPi上面下载
# --force-reinstall:强制重新安装,即便这个包在系统里已经最新
# --no-binary=:all: :不允许使用二进制包,:all:表示对所有相关的依赖包也采用同样的选择
time python -m pip install --no-cache-dir --force-reinstall --no-binary=:all: numpy
# 使用whl包安装
# --only-binary=numpy:指定针对numpy使用二进制包(即已编译好的发行版)
time python -m pip install -no-cache-dir --force-reinstall --only-binary=numpy numpy

在采用第一种方式的时候,你还很有可能遇到报错,说有一些依赖的头文件没找到,这也从侧面凸显了whl的好处:不用怎么担心依赖关系。

2.3.2 开发者角度

从开发者的角度来看,提供whl或是源发行包则取决于对项目复杂性、相互依赖关系以及其他因素的综合考量。如果要提供whl包,那就要针对不同的平台都要准备,对兼容性要有比较全面的考虑。


三、wheel(.whl)包到底是什么

wheel包本质上是一个zip文件。是已编译发行版的一种格式。需要注意的是,尽管它是已经编译好的,包里面一般不包含.pyc或是Python字节码。一个wheel包的文件名由以下这些部分组成:

{dist}-{version}(-{build})?-{python}-{abi}-{platform}.whl

举个例子:

tensorflow-2.3.1-cp36-cp36m-macosx_10_9_x86_64.whl

  • tensorflow是包名(dist)。
  • 2.3.1是包的版本号(version)。
  • cp36是对python解释器和版本的要求(python)。cp指的是CPython解释器,35指的是版本3.5的Python。比如你拿JPython解释器,这个包就不能用了。
  • cp36m是ABI的标签(python)。ABI即应用二进制接口(Application Binary Interface)。这个一般来说我们不用关心。
  • macosx_10_9_x86_64是平台标签(platform),告诉我们这个包是为macOS操作系统的,使用10.9的macOS developer SDK编译,适用于x86-64指令集。

再举个例子:

requests-2.7.0-py2.py3-none-any.whl (470.6 kB)

  • py2.py3告诉我们这个包对Python2和3都能支持。
  • none是ABI标签,在这里是没有,也不用考虑。
  • any是平台,意味着这个包在任何平台上都能用。
  • 一般如果遇上py2.py3-none-any结尾的whl包,那说明这个包是通用wheel包(universal wheel)——对Python版本、ABI和平台都没有要求。

还有个例子:

tensorflow-2.3.1-cp35-cp35m-manylinux2010_x86_64.whl

  • manylinux是一个比较有意思的平台标签。鉴于Linux系统有不同的发行版(Ubuntu,CentOS,Fedora等等),而你的包里有需要编译的C/C++代码,那有可能不同Linux发行版就不能运行你的包了,而为每个Linux发行版生成一个wheel又太麻烦,所以就诞生了manylinux系列标签:manylinux1(PEP513),manylinux2010(PEP571)和manylinux2014(PEP599)。
  • manylinux标签的核心是一个CentOS的Docker镜像,打包了一些编译器套件、多版本Python和pip、动态库等来确保兼容性。这个在PEP513里面有提到。

四、wheel包的好处

  1. 安装快;
  2. 一般比源发行版体积小很多。比方说matplotlib,它的wheel包最大只有11.6MB,而源码却有37.9MB。网络传输的压力显然是wheel小;
  3. 免除了setup.py的执行。setup.py是Python的disutils、setuptools编译机制所需要的文件,需要执行大量的编译、安装工作,如果没有wheel的存在,包的安装、维护都会很麻烦;
  4. 不需要编译器。pip在下载时帮你确定了版本、平台等信息;
  5. 使用wheel的话,pip自动为你生成.pyc文件,方便Python解释器的读取。

总结

以上就是作为一个普通用户需要了解的关于wheel包的知识了。下一篇(如果没有放鸽子的话)打算来谈一谈作为开发者如何去创建、发布你的wheel包。

参考资料

  • An Overview of Packaging for Python
  • Python Packaging Glossary
  • pip install
  • PEP-427: The Wheel Binary Package Format 1.0

【旁门Python 01】什么是wheel包,如何去用它?相关推荐

  1. python之wheel 包命名规则、abi 兼容和安装

    一.windows安装python包,遇见的问题 1.python3以后的版本,安装python包,可以直接使用pip安装,但是安装时偶尔报错 2.安装python源码包,如何确定自己该安装哪个版本, ...

  2. MegEngine Windows Python wheel 包减肥之路

    01 写在之前 1.1 本文的目的 通过讲述在支持 MegEngine Windows Python wheel 过程中遇到的问题以及解决问题的流程,此文最后的解决方法可能不是最优,欢迎留言指正. 过 ...

  3. 如何从 OpenVINO 的主分支构建 Python Wheel 包

    作者:Adrian Boguszewski 和 Raymond Lo 翻译:武卓 博士  英特尔AI框架软件布道师 什么是Wheel包? Python *.whl文件或者叫Wheel包,是一个 Pyt ...

  4. Python打包Wheel包的傻瓜式一站教程

    本教程只讲最简单的情况,把一个python的project打包成一个wheel包. 1. setup.py 文件示例: from setuptools import find_packages fro ...

  5. Apple M1上如何用pip安装x86的Python Wheel包

    最近可能很多人在犹豫要不要买Apple M1的苹果电脑,担心兼容性问题.其实完全不用担心.Apple M1绝对是强大的生产力工具.这里分享下如何用pip安装x86的Python wheel包. 安装p ...

  6. 无网络服务器(linux ubuntu),pip安装python科学计算所有需要包(packages)

    无网络服务器(linux ubuntu),pip安装python科学计算所有需要包(packages) # 在windows上打开anaconda,进入环境tab页,在base环境处单击,然后点开te ...

  7. python离线安装pip.whl_20180903 - Python Pip 工具下载whl包与离线安装

    20180903 - Python Pip 工具下载whl包与离线安装 1. 我的Blog 2. 简介信息 摘要:Linux下,python,pip工具离线安装包 Author: andy_yhm@y ...

  8. 第三章:python项目的结构和包的创建

    python项目的结构和包的创建 在python的圈子里,有许多人无偿得公开自己开发的程序库,使用者可以通过pip 命令来安装这些库,我们在发布时需要将其创建成一种特殊的文件,这种文件就是程序包,我们 ...

  9. Python的数据科学函数包(三)——matplotlib(plt)

    Matplotlib是Python最著名的2D绘图库 c opencv要比PIL, plt的速度更快一些 matplotlib中一张图的具体构造 如果将Matplotlib绘图和我们平常画画相类比,可 ...

最新文章

  1. MFC/UDP通信函数详细解说
  2. linux ctime 时间戳,Linux时间戳atime ctime mtime区别及相关命令
  3. Repeater控件嵌套使用
  4. 【转】分布式事务的常见解决方案
  5. js获取自定义属性的值
  6. 福建省计算机c语言成绩查询时间,计算机C语言等级考试模拟题(福建省).doc
  7. 金3银4面试前,把自己弄成卷王
  8. ios9提取安装包ipa_iOS获取App ipa包
  9. Excel——如何批量从身份证号码中提取出年龄
  10. Android一键锁屏与抬手亮屏的实现
  11. 饥饿的小易(java)
  12. 主板上的jrgb接口干什么用_主板vdg接口是什么
  13. Android HAL层到驱动代码搜索---基于背光亮度的调试
  14. HTML5 Canvas核心技术迷你书
  15. Latex入门_第2章:用latex排版文字
  16. html中meta的写法规范,HTML代码meta标签的charset 属性写法及用法
  17. 巨头博弈工业互联网的“大航海时代”
  18. http协议没有已注册的程序
  19. 天源迪科和科大讯飞的关系_科大讯飞618战报逆风上扬:讯飞智能鼠标夺得天猫京东双冠军...
  20. So Easy!只需点几下Next,Kei lC51便能与MDK完美共存(附:最新软件及2032注册机)

热门文章

  1. 922175-70-0,Galacto-RGD,RGDfK(SAA),νβ3表达成像示踪剂
  2. CentOS8 安装 Docker repo ‘appstream‘ 下载元数据失败
  3. 企业平台云化如何迁移?迁移的基本思路是什么?
  4. 17.Rust中函数式语言功能:迭代器与闭包
  5. l7sa008b故障代码_华硕主板故障维代码指南
  6. MTCNN配置及训练详细步骤
  7. 1M的宽带下载速度为什么不是1M
  8. 人工神经网络与深度神经网络
  9. HTML期末大学生网页设计作业 (我的家乡南京介绍网站制作)
  10. 编程语言 vs. 二次元美女