前言

Python .whl文件(或wheels)是Python中很少探讨的一部分,然而它们对Python包的装置过程十分重要。如果您曾经应用pip装置了Python包,那么很有可能是轮子(wheels)使装置速度更快、效率更高了。

轮子是Python生态系统的一个组件,它有助于使包的装置工作失常进行。它们容许更快的装置和更稳固的包散发过程。

在本教程中,您将深刻理解轮子是什么,它们提供了什么益处,以及它们是如何取得吸引力并使应用Python变得更不便的。

轮子简介

在学习如何将我的项目打包到轮子中之前,从用户的角度理解应用轮子是什么样子是很有帮忙的。能够像平常一样在环境中装置一个Python包来开始这个试验。

在这种状况下,装置uWSGI 2.0.x版本:

 1 $ 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 uwsgi 10 Installing collected packages: uwsgi 11 Successfully installed uwsgi-2.0.18 

要完全安装uWSGI, pip须要通过几个不同的步骤:

•在第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:

 1 $ 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秒多一点的工夫,即仅为密码学及其依赖项应用源散发版时所用工夫的八分之一。

福利:豆花同学为大家精心整顿了一份对于linux和python的学习材料大合集!有须要的小伙伴们,关注豆花集体公众号:python头条!回复关键词“材料合集”即可收费支付!