为什么我们需要python包装(例如鸡蛋)?

时间:2017-02-23 08:59:13

标签: python

当我需要一个Python库时,我使用pip从PyPi获取它,如果我创建一个项目并希望共享它,我只需要安装setup.py文件,这样可以轻松安装。因此,我想知道鸡蛋或轮包的用例是什么。

2 个答案:

答案 0 :(得分:2)

Python Packaging User Guide必须在此主题上说明以下内容:

  

Wheel and Egg都是打包格式,旨在支持需​​要不需要构建或编译的安装工件的用例,这在测试和生产工作流程中可能会很昂贵。

这些格式可用于分发包含二进制扩展模块的包。否则,这些将需要在安装期间进行编译。

如果不涉及编译,source distribution原则上就足够了,但是出于性能原因,用户指南仍然建议创建一个轮子:

  

最低限度,你应该创建一个Source Distribution:

     

python setup.py sdist

     

“源代码分发”是未构建的(即,它不是内置分发版),并且在通过pip安装时需要构建步骤。 即使发布是纯python(即不包含扩展名),它仍然需要构建步骤来构建setup.py中的安装元数据。

     

[...]

     

您还应该为项目创建一个轮子。轮子是一个构建的包,无需经过“构建”过程即可安装。对于最终用户而言,安装轮子要比从源代码分发安装快得多。

简而言之,包装是一种方便的东西 - 主要是为了用户。

Wheel包统一了分发和安装包含纯python,平台相关代码或编译扩展的项目的过程。如果软件包是用Python或C语言编写的,用户无需担心 - 它只是起作用。

答案 1 :(得分:1)

鸡蛋包是一个较旧的标准,你现在应该忽略它们。使用pip install .代替./setup.py install来阻止创建它们。 (附录:它们也是伪装的.zip,Python从中读取包数据 - 并不是最高效的解决方案)

另一方面,轮组件是新标准。它们允许为Windows,macOS和Linux (yes, Linux!)创建可移植的二进制包。如今,你可以做pip install PyQt5(作为一个例子),它只会工作,系统上不需要C ++编译器和Qt库。一切都是预先编译并包含在方向盘中。非二进制包也有好处,因为不运行setup.py更安全(所有元数据都在方向盘中)。 (附录:那些也是.zip s,但安装后会解压缩)