乐趣区

关于云计算:什么是Python-Wheels为什么要学Python-Wheels

前言

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 头条!回复关键词“材料合集”即可收费支付!

退出移动版