【问题标题】:Why we need python packaging (e.g. egg)? [duplicate]为什么我们需要python包装(例如egg)? [复制]
【发布时间】:2017-07-13 15:51:14
【问题描述】:

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

【问题讨论】:

  • 我知道它是什么。我不明白它的必要性,因为编译概念不适用于 python,因为它适用于例如 C 或 java。

标签: python


【解决方案1】:

Python Packaging User Guide 不得不就这个话题说如下:

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

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

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

至少,您应该创建一个 Source Distribution:

python setup.py sdist

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

[...]

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

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

Wheel 包统一了包含纯 Python、平台相关代码或已编译扩展的项目的分发和安装过程。用户无需担心包是用 Python 还是 C 编写的——它可以正常工作。

【讨论】:

  • 谢谢,但通常我使用的所有项目都只有配置文件和 python 脚本,所以不需要编译。因此,我认为包装不是通常使用或需要的东西(至少在我的情况下)
  • 谢谢!我的问题得到了回答:)
【解决方案2】:

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

另一方面,车轮套件是新标准。它们允许为 Windows、macOS 和 Linux (yes, Linux!) 创建便携式二进制包。如今,您只需执行pip install PyQt5(作为示例)就可以正常工作,系统上不需要C++ 编译器和Qt 库。一切都经过预编译并包含在轮子中。非二进制包也受益,因为不运行setup.py 更安全(所有元数据都在轮子中)。 (附录:这些也是.zips,但安装时已解包)

【讨论】:

  • 谢谢。但是,如果我的项目只包含 python 脚本和配置文件,那么轮子包不会带来任何好处,对吧?
  • @M.Buil pythonwheels.com避免安装时执行任意代码。 (避免 setup.py)。创建 .pyc 文件作为安装的一部分,以确保它们与使用的 python 解释器匹配。跨平台和机器的安装更加一致。
猜你喜欢
  • 2013-08-04
  • 2018-02-23
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多