Python: 为什么有些包被安装为“egg文件”而有些则被安装为“egg文件夹”?

28

我维护了几个Python包,它们的setup.py文件非常相似。然而,在执行setup.py install时,其中一个包被安装成了"egg"格式,而其他包则被安装成了"egg文件夹",即扩展名为"egg"的文件夹。

是什么造成了这种不同的行为?它们之间有什么区别?

2个回答

29

Python Eggs的内部结构, Zip支持元数据 :

如果存在 zip-safe,则表示项目可以在安装为 .egg 压缩包时正常工作,而反之,存在 not-zip-safe 意味着该项目不应安装为 .egg 文件(即作为 .egg 目录)。setuptools 的 setup() 中的 zip_safe 选项确定将编写哪个文件。如果未提供该选项,则 setuptools 将基于代码和内容分析尝试自行评估软件包是否可用。


10
什么使一个项目能够被压缩并安全传输?为什么要选择其中之一?(我是作为一个正在打包项目的人提问。) - Josh Bleecher Snyder
2
从setuptools文档中:http://peak.telecommunity.com/DevCenter/setuptools#setting-the-zip-safe-flag - saffsd
1
saffsd的链接应该是https://setuptools.readthedocs.io/en/latest/setuptools.html#setting-the-zip-safe-flag - ax.
十年后,@saffsd的链接现在将是https://setuptools.pypa.io/en/latest/deprecated/zip_safe.html(包括“此标志被视为已过时”)。 - ax.

5
一个单独的egg文件实际上是一个带有特定目录结构的zip归档文件。根据zipimport文档,只能从zip文件中导入.py.pyc.pyo文件。因此,如果包需要导入其他类型的模块资源(如编译的c代码;.so文件,.pyd文件),它将无法作为zip文件工作。
我不知道这是否是一些egg文件不能作为zip归档文件工作的唯一原因,但我认为这是主要原因。

这不是主要原因。甚至不是一个正确的原因。setuptools添加了特殊的加载器,使得即使在压缩的egg文件中,.so和.pyd文件也能正常工作。另一个答案才是正确的。 - PJ Eby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接