sdist' .tar.gz发行版和Python egg有什么区别?
我有点困惑。看起来Python有两种不同的包,一种是源代码分发(setup.py sdist),另一种是蛋形分发(setup.py bdist_egg)。
这两种包似乎都是包含相同数据的压缩文件,也就是Python的源代码文件。一个不同之处是,pip
,也就是最推荐的包管理工具,无法安装蛋形包。
这两者之间有什么区别呢?我应该用什么方式来分发我的包呢?
(注意,我并不想通过PyPI来分发我的包,但我想使用一个可以从PyPI获取我的依赖的包管理工具。)
2 个回答
2021年更新:用于构建和使用egg的工具在Python中已经不存在了。
其实Python的包类型远不止两种。这条命令可以列出很多子命令:
$ python setup.py --help-commands
注意不同的 bdist 类型。
egg 曾经是一种新型的包,由setuptools引入,后来被标准库采纳。它的设计是要整体安装到 sys.path
中。这和 sdist 包不同,后者需要运行 setup.py install
,把每个文件复制到合适的位置,并可能还会执行其他操作(比如构建扩展模块,运行包中包含的额外Python代码)。
现在egg基本上已经过时了。补充说明:egg已经消失,它们是通过“easy_install”命令使用的,而这个命令已经从Python中移除了。
现在推荐的打包格式是“wheel”格式,特别是在使用“pip install”时。
你创建sdist、egg(或wheel)与否,和你能否声明包的依赖关系是独立的(这些依赖关系会在安装时自动从PyPI下载)。要让这个依赖功能正常工作,你只需要使用 distribute(setuptools的继任者)或 distutils2(distutils的继任者,现在在Python 3.x的开发版本中被称为 packaging)提供的额外API来声明这些依赖关系。
https://packaging.python.org/ 是一个很好的资源,可以获取更多关于打包的信息。它涵盖了一些声明依赖关系的具体内容(例如 install_requires,但据我所知没有提到 extras_require
)。
setup.py sdist
命令会创建一个源代码分发包:这个包里包含了 setup.py 文件、你的模块或脚本的源代码文件(.py 文件或者二进制模块的 .c/.cpp 文件)、数据文件等等。最终的结果是一个压缩包,可以在任何平台上用来重新编译所有内容。
setup.py bdist
(还有 bdist_*
)命令会创建一个构建分发包:这个包里包含了 .pyc 文件、二进制模块的 .so/.dll/.dylib 文件,如果在 Windows 上使用 py2exe
,还会有 .exe 文件,还有你的数据文件……不过这个包里没有 setup.py 文件。最终的结果是一个特定于某个平台(比如 linux-x86_64
)和某个 Python 版本的压缩包,可以通过简单地解压到你的文件系统根目录来安装(可执行文件会放在 /usr/bin(或类似的地方),数据文件在 /usr/share,模块在 /usr/lib/pythonX.X/site-packages/...)。你甚至可以构建 rpm 格式的压缩包,这样可以直接用你的包管理器来安装。