51

我有点困惑。似乎有两种不同类型的 Python 包,源代码分发 (setup.py sdist) 和 egg 分发 (setup.py bdist_egg)。

两者似乎都只是具有相同数据的档案,即 python 源文件。一个区别是pip,最推荐的包管理器,不能安装鸡蛋。

两者之间有什么区别,分发我的包裹的“方法”是什么?

(注意,我不想通过 PyPI 分发我的包,但我想使用一个包管理器从 PyPI 获取我的依赖项)

4

2 回答 2

68

setup.py sdist创建一个源分发:它包含 setup.py、模块/脚本的源文件(.py 文件或 .c/.cpp 用于二进制模块)、您的数据文件等。结果是可以使用的存档在任何平台上重新编译所有内容。

setup.py bdist (and bdist_*) creates a built distribution: it includes .pyc files, .so/.dll/.dylib for binary modules, .exe if using py2exe on Windows, your data files... but no setup.py. The result is an archive that is specific to a platform (for example linux-x86_64) and to a version of Python, and that can be installed simply by extracting it into the root of your filesystem (executables are in /usr/bin (or equivalent), data files in /usr/share, modules in /usr/lib/pythonX.X/site-packages/...). You can even build rpm archives that can be directly installed using your package manager.

于 2011-06-09T12:35:16.030 回答
20

2021 年更新:Python 中不再存在构建和使用鸡蛋的工具。

有不止两种不同类型的 Python(分发)包。此命令列出了许多子命令:

$ python setup.py --help-commands

注意各种不同的bdist类型。

egg一种新的包类型,由 setuptools 引入,但后来被标准库采用。它旨在整体安装到sys.path. 这与sdist包不同,后者旨在setup.py install运行,将每个文件复制到适当的位置,并且可能还会采取其他操作(构建扩展模块,运行包中包含的其他任意 Python 代码)。

鸡蛋在这个时候基本上已经过时了。编辑:鸡蛋不见了,它们与从 Python 中删除的命令“easy_install”一起使用。

现在最受欢迎的打包格式是“wheel”格式,特别是“pip install”使用。

无论您是创建一个 sdist 还是一个 egg(或 wheel),都与您是否能够声明包具有哪些依赖项(由 PyPI 在安装时自动下载)无关。要使这个依赖特性起作用,你只需要使用由分发(setuptools 的后继者)或distutils2 (distutils 的后继者——在 Python 3 的当前开发版本中也称为打包)提供的额外 API 来声明依赖项。 X)。

https://packaging.python.org/是获取有关包装的更多信息的好资源。它涵盖了声明依赖项的一些细节(例如install_requires但不是extras_requireafaict)。

于 2011-06-09T12:22:47.480 回答