前言Python.whl文件(或wheels)是Python中很少被讨论的部分,但它们对Python包安装过程非常重要。如果您使用pip安装了Python包,轮子很有可能使安装更快、更高效。Wheels是Python生态系统的一个组件,有助于使包安装工作。它们允许更快的安装和更稳定的包分发过程。在本教程中,您将深入了解轮子是什么、它们提供什么好处以及它们如何获得牵引力并使使用Python更方便。Wheel简介在学习如何将项目打包到wheel之前,从用户的角度了解wheel的使用情况会很有帮助。这个实验可以像往常一样在环境中安装一个Python包来开始。在这种情况下,安装uWSGI版本2.0.x:$python-mpipinstall'uwsgi==2.0.*'2Collectinguwsgi==2.0.*3Downloadinguwsgi-2.0.18.tar.gz(801kB)4|████████████████████████████████|801kB1.1MB/s5Buildingwheelsforcollectedpackages:uwsgi6Buildingwheelforuwsgi(setup.py)...done7Createdwheelforuwsgi...uWSGI-2.0.18-cp38-cp38-macosx_10_15_x86_64.whl8Storedindirectory:/private/var/folders/jc/8_hqsz0x1tdbp05...9Successfullybuiltuwsgi10Installingcollectedpackages:uwsgi11Successfullyinstalleduwsgi-2.0.18需要完全安装在几行不同的uWS:p:tAR文件中(tarball)称为uwsgi-2.0.18.tar.gz,它是用gzip压缩的。在第6行,它获取tarball并通过调用setup.py构建一个.whl文件。在第7行,它将轮子标记为uWSGI-2.0.18-cp38-cp38-macosx_10_15_x86_64.whl。在第10行,它在构建轮子后安装实际包。pip检索到的tar.gztarball是源代码分发版或sdist,而不是wheel。在某些方面,sdist与wheel相反。源代码分发包含源代码。这不仅包括Python代码,还包括与包捆绑在一起的任何扩展模块的源代码(通常用C或C++编写)。对于源代码分发,扩展模块是在用户端编译的,而不是开发人员端。源代码分发还包含一个元数据包,位于名为.egg-info的目录中。此元数据有助于构建和安装包,但用户实际上不需要对其执行任何操作。从开发人员的角度来看,当您运行时会创建源分发包:$pythonsetup.pysdist现在尝试安装不同的包:chardet:$python-mpipinstall'chardet==3.*'2Collectingchardet3Downloadingchardet-3.0.4-py2.py3-none-any.whl(133kB)4|█████████████████████████████████|133kB1.5MB/s5安装收集的包:chardet6Successfullyinstalledchardet-3.0.4你可以看到与uWSGI安装明显不同的输出。安装chardet时直接从PyPI下载一个.whl文件。车轮名称是chardet-3.0.4-py2.py3-none-any。whl遵循特定的命名约定,稍后您将看到。更重要的是,从用户的角度来看,当pip在PyPI上找到兼容的wheel时,没有构建阶段。从开发人员的角度来看,轮子是运行以下命令的结果:$pythonsetup.pybdist_wheel为什么uWSGI给你一个源代码分发,而chardet提供一个轮子?您可以通过查看PyPI上每个项目的页面并导航到下载文件区域来了解原因。本节将向您展示pip在PyPI索引服务器上实际看到的内容:由于项目的复杂性,uWSGI仅提供一个源代码分发(uWSGI-2.0.18.tar.gz)。chardet提供轮盘赌和源代码分发,但如果pip与您的系统兼容,它会更喜欢轮盘赌。稍后您将看到如何确定兼容性。wheel安装兼容性检查的另一个示例是psycopg2,它为Windows提供了大量的wheel,但没有为Linux或macOS客户端提供。这意味着,根据您的具体设置,pipinstallpsycopg2可以获取轮子或源代码分发。为了避免这些类型的兼容性问题,一些包提供了多个轮子,每个轮子都针对特定的Python实现和底层操作系统。到目前为止,您已经看到了wheels和sdist之间的一些明显差异,但更重要的是这些差异如何影响安装过程。wheelspeedup安装在上面,你可以看到获取预制轮子的安装和下载sdist安装的比较。Wheels使Python包的端到端安装更快,原因有二:在其他条件相同的情况下,wheels通常比源分发版小,这意味着它们可以更快地在网络中移动。直接从wheels安装避免了从源分发构建包的中间步骤。几乎可以肯定,安装chardet只需要uWSGI花费的时间的一小部分。然而,这是一个不公平的比较,因为chardet是一个小得多且简单得多的包。使用不同的命令,您可以创建更直接的比较,以展示轮子产生的差异有多大。您可以使用-no-binary选项告诉pip忽略它对方向盘的倾斜:$timepython-mpipinstall\--no-cache-dir\--force-reinstall\--no-binary=:all:\cryptographyThis命令计算当安装加密包时,告诉pip使用源代码分发,即使有合适的轮子可用。include:all:使规则适用于密码学及其所有依赖项。在我的机器上,从开始到结束大约需要32秒。不仅安装需要很长时间,而且构建加密需要OpenSSL开发头文件可用并且适用于Python。现在可以重新安装密码学,但这次要确保pip使用PyPI的轮子。因为pip更喜欢wheels,这类似于调用pipinstall根本没有参数。但在这种情况下,您可以通过要求wheel-pure-binary来明确意图:此选项只需要4秒多一点,或者是将源代码分发仅用于加密及其依赖项所花费时间的八分之一。
