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

M. *_*uil 11 python

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

kaz*_*ase 7

Python的包装用户指南不得不说关于这一主题的情况如下:

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

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

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

至少,您应该创建一个源代码分发:

python setup.py sdist

“源代码分发”是未构建的(即,它不是构建的分发),并且在通过 pip 安装时需要一个构建步骤。即使发行版是纯 python(即不包含扩展),它仍然涉及构建步骤以从 setup.py 构建安装元数据。

[...]

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

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

Wheel 包统一了分发和安装包含纯 Python、平台相关代码或编译扩展的项目的过程。用户无需担心包是用 Python 还是 C 编写的 - 它只是有效。


Chr*_*ick 7

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

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