我有点困惑。似乎有两种不同类型的 Python 包,源代码分发 (setup.py sdist) 和 egg 分发 (setup.py bdist_egg)。
两者似乎都只是具有相同数据的档案,即 python 源文件。一个区别是pip
,最推荐的包管理器,不能安装鸡蛋。
两者之间有什么区别,分发我的包裹的“方法”是什么?
(注意,我不想通过 PyPI 分发我的包,但我想使用一个包管理器从 PyPI 获取我的依赖项)
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.
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_require
afaict)。