'sdist'.tar.gz发行版和蟒蛇蛋有什么区别?

Pet*_*mit 31 python egg sdist

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

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

两者之间的区别是什么?分发我的包的方式是什么?

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

Sch*_*uki 39

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

setup.py bdist(和bdist_*)创建一个内置的发行版:它包括.pyc文件,.so/.dll/.dylib用于二进制模块,.exe(如果py2exe在Windows上使用),您的数据文件...但没有setup.py.结果是一个特定于平台(例如linux-x86_64)和Python版本的存档,只需将其解压缩到文件系统的根目录即可安装(可执行文件位于/ usr/bin(或等效),/usr/share中的数据文件,/ usr/lib/pythonX.X/site-packages/...中的模块.您甚至可以构建可以使用包管理器直接安装的rpm存档.


Jea*_*one 14

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

$ python setup.py --help-commands
Run Code Online (Sandbox Code Playgroud)

请注意各种不同的bdist类型.

一个鸡蛋一种新的包装类型,由setuptools引入,但后来被标准库采用.它意味着要安装在整体上sys.path.这不同于sdist包,它意味着setup.py install运行,将每个文件复制到位并可能采取其他操作(构建扩展模块,运行包中包含的其他任意Python代码).

此时鸡蛋在很大程度上已经过时了.现在最受欢迎的包装格式是"轮子"格式.

无论是创建一个sdist还是一个egg(或wheel),都与您是否能够声明包具有哪些依赖关系(在安装时由PyPI自动下载)无关.此依赖项功能所需的全部工作是使用distribute(setuptools的后继者)或distutils2(distutils的后继者 - 在Python 3的当前开发版本中称为打包)提供的额外API来声明依赖项. X).

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

  • 他们并不完全.sdist是一个"源代码分发".bdist是一个"二元分布".对于纯Python项目,这些事情非常接近.但是,如果您的项目包含任何扩展模块,则sdist包含这些扩展模块的源,并且使用该sdist将需要编译器.bdist包含这些扩展模块的编译形式,并且不需要编译器,但只能在与您创建bdist的系统非常接近的系统上运行(例如,在Linux上通常需要相同的*distro*). (4认同)