【发布时间】:2017-07-13 15:51:14
【问题描述】:
当我需要一个 Python 库时,我使用 pip 从 PyPi 中获取它,如果我创建一个项目并想要共享它,我只需要准备好 setup.py 文件,这样就可以轻松安装它。因此,我想知道 egg 或 wheel 包的用例是什么。
【问题讨论】:
-
我知道它是什么。我不明白它的必要性,因为编译概念不适用于 python,因为它适用于例如 C 或 java。
标签: python
当我需要一个 Python 库时,我使用 pip 从 PyPi 中获取它,如果我创建一个项目并想要共享它,我只需要准备好 setup.py 文件,这样就可以轻松安装它。因此,我想知道 egg 或 wheel 包的用例是什么。
【问题讨论】:
标签: python
Python Packaging User Guide 不得不就这个话题说如下:
Wheel 和 Egg 都是打包格式,旨在支持需要不需要构建或编译的安装工件的用例,这在测试和生产工作流程中可能成本很高。
这些格式可用于分发包含二进制扩展模块的包。否则,这些将需要在安装期间进行编译。
如果不涉及编译,source distribution 原则上就足够了,但出于性能原因,用户指南仍建议创建轮子:
至少,您应该创建一个 Source Distribution:
python setup.py sdist“源代码发行版”是未构建的(即,它不是构建发行版),并且在通过 pip 安装时需要构建步骤。 即使发行版是纯 python(即不包含扩展),它仍然涉及构建步骤,以从 setup.py 构建安装元数据。
[...]
您还应该为您的项目创建一个轮子。轮子是一个构建包,无需经过“构建”过程即可安装。对于最终用户而言,安装轮子比从源分发安装要快得多。
简而言之,包是一种方便的东西 - 主要是为了用户。
Wheel 包统一了包含纯 Python、平台相关代码或已编译扩展的项目的分发和安装过程。用户无需担心包是用 Python 还是 C 编写的——它可以正常工作。
【讨论】:
鸡蛋包是一个较旧的标准,现在你应该忽略它们。使用pip install . 而不是./setup.py install 来防止创建它们。 (附录:它们也是伪装的.zips,Python 从中读取包数据——这并不是最高效的解决方案)
另一方面,车轮套件是新标准。它们允许为 Windows、macOS 和 Linux (yes, Linux!) 创建便携式二进制包。如今,您只需执行pip install PyQt5(作为示例)就可以正常工作,系统上不需要C++ 编译器和Qt 库。一切都经过预编译并包含在轮子中。非二进制包也受益,因为不运行setup.py 更安全(所有元数据都在轮子中)。 (附录:这些也是.zips,但安装时已解包)
【讨论】: