将 python 库/应用程序打包为 .egg 文件有啥好处?

Posted

技术标签:

【中文标题】将 python 库/应用程序打包为 .egg 文件有啥好处?【英文标题】:What are the advantages of packaging your python library/application as an .egg file?将 python 库/应用程序打包为 .egg 文件有什么好处? 【发布时间】:2010-09-08 01:22:48 【问题描述】:

我已经阅读了一些关于 .egg 文件的内容,并且在我的 lib 目录中注意到了它们,但是作为开发人员使用 then 的优点/缺点是什么?

【问题讨论】:

【参考方案1】:

来自Python Enterprise Application Kit community:

“鸡蛋之于 Python 就像罐子之于 Java...”

Python 鸡蛋是一种捆绑方式 Python 的附加信息 项目,它允许项目的 要检查的依赖项和 在运行时满足,以及 允许项目提供插件 对于其他项目。有几种 包含鸡蛋的二进制格式,但是 最常见的是'.egg' zipfile 格式,因为它是一种方便的格式 用于分发项目。全部 格式支持包括 包特定数据,项目范围 元数据、C 扩展和 Python 代码。

Python Eggs 的主要好处 是:

它们支持“轻松安装”Python 包管理器等工具

.egg 文件是 Python 的“零安装”格式 包裹;没有构建或安装步骤 必需,只需将它们放在 PYTHONPATH 上 或 sys.path 并使用它们(可能需要 如果 C 扩展,则安装运行时 或使用数据文件)

它们可以包含包元数据,例如它们所依赖的其他鸡蛋

它们允许“命名空间包”(仅包含其他 包)被分成单独的 分布(例如 zope.、twisted.、 peak.* 包可以分发为 单独的鸡蛋,不像普通的包装 必须始终放在 相同的父目录。这允许 现在是什么巨大的单片包 分开分发 组件。)

它们允许应用程序或库指定所需的 库的版本,以便您可以 例如require("Twisted-Internet>=2.0") 在进行导入之前 扭曲的互联网。

它们是分发扩展或插件的绝佳格式 可扩展的应用程序和框架 (例如 Trac,它使用鸡蛋 从 0.9b1 开始的插件),因为鸡蛋 运行时提供简单的 API 来定位 鸡蛋并找到他们的广告条目 点(类似于 Eclipse 的 “扩展点”概念)。

还有其他可能来自标准化的好处 格式,类似的好处 Java 的“jar”格式。

-亚当

【讨论】:

但是如果依赖的 Python 包没有上传到 PyPi 的二进制鸡蛋怎么办?【参考方案2】:

一个鸡蛋本身并不比一个适当的源版本好。好的部分是依赖处理。就像 debian 或 rpm 包一样,你可以说你依赖于其他的 egg,它们会被自动安装(通过pypi.python.org)。

第二条评论:egg 格式本身是一种二进制打包格式。仅包含 python 代码的普通 python 包最好作为“源版本”分发,因此“python setup.py sdist”会生成 .tar.gz。这些在上传到 pypi 时通常也称为“eggs”。

您需要二进制鸡蛋的地方:当您捆绑一些 C 代码扩展时。然后你需要几个二进制鸡蛋(一个 32 位 unix 一个,一个 windows 一个,等等)。

【讨论】:

但是如果依赖的 Python 包没有上传到 PyPi 的二进制鸡蛋怎么办? 他们只是保留了必须拥有编译器的问题。没有神奇的解决方案:你要么有预编译的包/鸡蛋,要么没有。 是的,我有我的预编译包/鸡蛋,但是依赖项呢?有没有办法说如果鸡蛋在 PyPi 上不可用,请使用这个和这个存储库?【参考方案3】:

Eggs 是分发 python 应用程序的一种很好的方式。将其视为一个独立于平台的 .deb 文件,它将安装所有依赖项和诸如此类的东西。优点是最终用户易于使用。缺点是将应用打包为 .egg 文件可能很麻烦。

除了 .eggs 之外,您还应该提供另一种安装方式。有些人不喜欢使用鸡蛋,因为他们不喜欢软件程序安装它想要的任何软件的想法。这些通常是系统管理员类型。

【讨论】:

【参考方案4】:

.egg 文件基本上是部署 python 应用程序的好方法。您可以将其视为类似于 Java 的 .jar 文件。

更多信息here。

【讨论】:

【参考方案5】:

无论您做什么,都不要停止分发您的应用程序,也可以作为 tarball 分发,因为对于具有包系统的操作系统来说,这是最容易打包的格式。

【讨论】:

【参考方案6】:

对于简单的 Python 程序,您可能不需要使用鸡蛋。分发原始 .py 文件就足够了;这就像为 GNU/Linux 分发源文件。您还可以使用各种操作系统“打包程序”(如 py2exe 或 py2app)为不同的操作系统创建 .exe、.dmg 或其他文件。

更复杂的程序,例如由于需要各种模块和依赖项,Django 几乎需要鸡蛋。

【讨论】:

以上是关于将 python 库/应用程序打包为 .egg 文件有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

python库打包与发布 setup

python库打包与发布 setup

打包常见的python命名空间

每次我从 Python 库路径调用 .egg 时,AWS Glue 作业都会崩溃

安装scrapyd-client解决后期爬虫部署上线,打包成egg的方案

如何包含子目录(相对位置)中的 python .egg 库?