前言

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

轮子是Python生态系统的一个组件,它有助于使包的安装工作正常进行。它们允许更快的安装和更稳定的包分发过程。在本教程中,您将深入了解轮子是什么,它们提供了什么好处,以及它们是如何获得吸引力并使使用Python变得更方便的。

轮子简介

在学习如何将项目打包到轮子中之前,从用户的角度了解使用轮子是什么样子是很有帮助的。

可以像往常一样在环境中安装一个Python包来开始这个实验。在这种情况下,安装uWSGI 2.0.x版本:

 $ 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需要经过几个不同的步骤:

  1. 在第3行,它下载一个名为uwsgi-2.0.18.tar.gz的TAR文件(tarball),该文件是用gzip压缩的。
  2. 在第6行,它接受tarball并通过调用setup.py构建一个.whl文件。
  3. 在第7行,它将轮子标记为uWSGI-2.0.18-cp38-cp38-macosx_10_15_x86_64.whl。
  4. 在第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索引服务器上实际看到的内容:

  1. 由于项目的复杂性,uWSGI只提供了一个源分发版(uWSGI -2.0.18.tar.gz)。
  2. chardet同时提供了一个轮盘和一个源代码发行版,但是如果与您的系统兼容,pip会更喜欢轮盘。稍后您将看到如何确定兼容性。

另一个用于轮子安装的兼容性检查示例是psycopg2,它为Windows提供了大量的车轮,但没有为Linux或macOS客户端提供任何轮子。这意味着,根据您的具体设置,pip安装psycopg2可以获取一个滚轮或源分发版。

为了避免这些类型的兼容性问题,一些包提供了多个轮子,每个轮子都针对特定的Python实现和底层操作系统。

到目前为止,您已经看到了轮子和sdist之间的一些明显区别,但更重要的是这些区别对安装过程的影响。

轮子加速安装

在上面,您看到了获取预构建轮子的安装和下载sdist的安装的比较。轮子使得Python包的端到端安装速度更快,原因有两个:

  1. 在其他条件相同的情况下,轮子通常比源分发包更小,这意味着它们可以在网络中更快地移动。
  2. 直接从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/

union和union all有什么区别_什么是Python Wheels?为什么要关心它?相关推荐

  1. 安装python有什么用_什么是Python Wheels?为什么要关心它?,python有什么用

    什么是Python Wheels?为什么要关心它?,python有什么用 前言 Python .whl文件(或wheels)是Python中很少讨论的一部分,但是它们对Python包的安装过程非常重要 ...

  2. python的re2和re区别_浅谈Python中re.match()和re.search()的使用及区别

    1.re.match()fvk免费资源网 re.match()的概念是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None.fvk免费资源网 包含的参数如下: ...

  3. opencv和python的区别_所有这些OpenCV Python接口之间有何不同?

    拉风的咖菲猫 OpenCV正式发布了两种类型的Python接口,cv和cv2.简历:我开始工作cv.这样,所有OpenCV数据类型都将保留下来.例如,加载时,图像的格式cvMat与C ++中的相同.对 ...

  4. python for和while的用法区别_详解python while 函数及while和for的区别

    1.while循环(只有在条件表达式成立的时候才会进入while循环) while 条件表达式: pass while 条件表达式: pass else: pass 不知道循环次数,但确定循环条件的时 ...

  5. python新式类和旧式类的区别_浅谈python新式类和旧式类区别

    python的新式类是2.2版本引进来的,我们可以将之前的类叫做经典类或者旧式类. 为什么要在2.2中引进new style class呢?官方给的解释是: 为了统一类(class)和类型(type) ...

  6. sql和python有什么区别_该用Python还是SQL?4个案例教你节省时间

    在数据分析行业,对数据提出的每一个问题都可以用多种潜在的语言和工具包来回答.每种语言都有其优势,它们之间也存在着不同的区别.不能否认的是,有些操作用Python执行起来要比SQL更加高效.这篇文章分享 ...

  7. python write和writelines的区别_简单了解Python write writelines区别

    一.传入的参数类型要求不同: 1. file.write(str)需要传入一个字符串做为参数,否则会报错. write( "字符串") with open('20200222.tx ...

  8. python中协程与函数的区别_深入浅析python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

  9. 利用python进行数据分析第一版和第二版区别_《利用Python进行数据分析·第2版》第1章 准备工作...

    1.1 本书的内容 本书讲的是利用Python进行数据控制.处理.整理.分析等方面的具体细节和基本要点.我的目标是介绍Python编程和用于数据处理的库和工具环境,掌握这些,可以让你成为一个数据分析专 ...

最新文章

  1. 不上市就等死?AI故事难讲,豪门盛宴背后的“血”与“泪”
  2. DotNet 项目开发文档的自动生成和相关工具的使用
  3. 历史客人-报表记录信息
  4. 实用JavaScript网页特效编程百宝箱pdf
  5. .Net架构篇:实用中小型公司支付中心设计
  6. AGC011D - Half Reflector(模拟)
  7. java 读取集合到流中_Java 10:将流收集到不可修改的集合中
  8. 如何进行需求优先级管理?
  9. NAS 百科 —— http://baike.baidu.com/item/NAS%E7%BD%91%E7%BB%9C%E5%AD%98%E5%82%A8
  10. java 析构函数_《JAVA编程思想》5分钟速成:第5章(初始化和清理)
  11. 淘宝特价版注册“1元更香”商标,又一个新“节日”诞生了
  12. 回公司无聊和小冰聊天,很好奇她到底怎么想的
  13. javaSE----学习路线
  14. 计算机中键盘可以共享吗,两个电脑怎么共用一个键盘
  15. 微信怎么at所有人_微信怎么艾特所有人 微信艾特所有人方法
  16. android为APK新建SELINUX权限域seapp_contexts
  17. Unity分屏之使用TUIO实现互动投影
  18. GX works2 三菱PLC 显示注释后代码行变宽的解决方法
  19. WT2605-24SS音频解码芯片,实现宠物(玩具)喂食器远程更新语音技术方案解析
  20. linux查看服务器带宽

热门文章

  1. 极客邦科技旗下TGO鲲鹏会成立美国硅谷分会
  2. Python--练习及面试题
  3. 67 个节省开发者时间的实用工具、库与资源(前端向)
  4. linux shell 编程 12 重定向
  5. .NET重构—单元测试重构
  6. 站点某些网页想显示母版页内的用户控件,某些网页不想显示,怎样实现
  7. PHP中一个好用的函数parse_url
  8. 5G服务可以解决的4个企业WAN挑战 - vecloud
  9. BenchmarkDotNet的使用
  10. oracle对日期date类型操作的函数