Python .whl文件(或wheels)是Python中不多讨论的一部分,可是它们对Python包的安装过程很是重要。若是您已经使用pip安装了Python包,那么颇有多是轮子(wheels)使安装速度更快、效率更高了。python
轮子是Python生态系统的一个组件,它有助于使包的安装工做正常进行。它们容许更快的安装和更稳定的包分发过程。在本教程中,您将深刻了解轮子是什么,它们提供了什么好处,以及它们是如何得到吸引力并使使用Python变得更方便的。c++
在学习如何将项目打包到轮子中以前,从用户的角度了解使用轮子是什么样子是颇有帮助的。web
能够像往常同样在环境中安装一个Python包来开始这个实验。在这种状况下,安装uWSGI 2.0.x版本:shell
$ python -m pip install 'uwsgi==2.0.*' 2 Collecting uwsgi==2.0.* 3 Downloading uwsgi-2.0.18.tar.gz (801 kB) 4 |████████████████████████████████| 801 kB 1.1 MB/s 5 Building wheels for collected packages: uwsgi 6 Building wheel for uwsgi (setup.py) ... done 7 Created wheel for uwsgi ... uWSGI-2.0.18-cp38-cp38-macosx_10_15_x86_64.whl 8 Stored in directory: /private/var/folders/jc/8_hqsz0x1tdbp05 ... 9 Successfully built uwsgi10 Installing collected packages: uwsgi11 Successfully installed uwsgi-2.0.18
要彻底安装uWSGI, pip须要通过几个不一样的步骤:macos
在第3行,它下载一个名为uwsgi-2.0.18.tar.gz的TAR文件(tarball),该文件是用gzip压缩的。服务器
在第6行,它接受tarball并经过调用setup.py构建一个.whl文件。微信
在第7行,它将轮子标记为uWSGI-2.0.18-cp38-cp38-macosx_10_15_x86_64.whl。网络
在第10行,它在构建了轮子以后安装实际的包。编辑器
pip检索的tar.gz tarball是一个源分发包,或sdist,而不是一个轮子。在某些方面,sdist是轮子的反义词。学习
源代码发行版包含源代码。这不只包括Python代码,还包括与包绑定的任何扩展模块的源代码(一般用C或c++编写)。对于源发行版,扩展模块是在用户端而不是开发人员端编译的。
源分发版还包含一个元数据包,位于名为.egg-info的目录中。该元数据有助于构建和安装包,但用户实际上并不须要使用它作任何事情。
从开发人员的角度来看,当您运行如下命令时,会建立一个源分发包:
$ python setup.py sdist
如今尝试安装一个不一样的包:chardet:
$ python -m pip install 'chardet==3.*' 2 Collecting chardet 3 Downloading chardet-3.0.4-py2.py3-none-any.whl (133 kB) 4 |████████████████████████████████| 133 kB 1.5 MB/s 5 Installing collected packages: chardet 6 Successfully installed chardet-3.0.4
您能够看到一个与uWSGI安装明显不一样的输出。
安装chardet时直接从PyPI下载一个.whl文件。车轮名称为chardet-3.0.4-py2.py3-none-any。whl遵循特定的命名约定,稍后您将看到。从用户的角度来看,更重要的是,当pip在PyPI上找到一个兼容的滚轮时,并不存在构建阶段。
从开发人员的角度来看,轮子是运行如下命令的结果:
$ python setup.py bdist_wheel
为何uWSGI给你一个源分布,而chardet提供一个轮子?您能够经过查看PyPI上每一个项目的页面并导航到下载文件区域来了解缘由。本节将向您展现pip在PyPI索引服务器上实际看到的内容:
因为项目的复杂性,uWSGI只提供了一个源分发版(uWSGI -2.0.18.tar.gz)。
chardet同时提供了一个轮盘和一个源代码发行版,可是若是与您的系统兼容,pip会更喜欢轮盘。稍后您将看到如何肯定兼容性。
另外一个用于轮子安装的兼容性检查示例是psycopg2,它为Windows提供了大量的车轮,但没有为Linux或macOS客户端提供任何轮子。这意味着,根据您的具体设置,pip安装psycopg2能够获取一个滚轮或源分发版。
为了不这些类型的兼容性问题,一些包提供了多个轮子,每一个轮子都针对特定的Python实现和底层操做系统。
到目前为止,您已经看到了轮子和sdist之间的一些明显区别,但更重要的是这些区别对安装过程的影响。
在上面,您看到了获取预构建轮子的安装和下载sdist的安装的比较。轮子使得Python包的端到端安装速度更快,缘由有两个:
在其余条件相同的状况下,轮子一般比源分发包更小,这意味着它们能够在网络中更快地移动。
直接从wheels安装避免了从源分发版构建包的中间步骤。
几乎能够保证,安装chardet只需uWSGI所需时间的一小部分。然而,这是一种不公平的比较,由于chardet是一个明显更小和更简单的包。使用不一样的命令,您能够建立一个更直接的比较,它将演示轮子形成的差别有多大。
你能够经过-no-binary选项让pip忽略它对车轮的倾斜:
time python -m pip install \ --no-cache-dir \ --force-reinstall \ --no-binary=:all: \ cryptography
这个命令计算加密包的安装时间,告诉pip使用源分发包,即便有合适的轮可用。包括:all:使规则适用于密码学及其全部依赖关系。
在个人机器上,从开始到结束大约须要32秒。不只安装要花费很长时间,并且构建加密还须要提供OpenSSL开发头,并可用于Python。
如今能够从新安装密码学,可是此次要确保pip使用来自PyPI的wheels。由于pip更喜欢轮子,因此这相似于彻底不带参数调用pip install。但在这种状况下,你可让意图显式经过要求车轮-纯二进制:
此选项仅花费4秒多一点的时间,即仅为密码学及其依赖项使用源分发版时所用时间的八分之一。
英文原文:
https://realpython.com/python-wheels/
本文分享自微信公众号 - Python学会(gh_39aead19f756)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。