【问题标题】:What is the difference between an 'sdist' .tar.gz distribution and an python egg?'sdist' .tar.gz 发行版和 python 鸡蛋有什么区别?
【发布时间】:2011-09-11 16:02:13
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python egg sdist


    【解决方案1】:

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

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

    【讨论】:

    • 我已经尝试了以上两个选项。首先创建一个源分发,然后创建一个构建分发。当我创建 Src Dist 时,它会创建一个可以用于 drc 分发的 .gz 文件。但是对于构建分发,当我执行 bdist 时,它会创建两个文件夹,一个名为 lib,另一个名为 bdist.win32 的空目录。我想做一些类似的事情,为 linux 系统(可能是二进制)创建一个发行版,我可以将它提供给最终用户,最终用户应该能够使用该应用程序但不能阅读代码。我怎样才能做到这一点? RPM 是答案吗?
    • 为什么要用 Python 创建一个内置发行版?用例是什么?
    • @MartinThoma C 扩展为各种平台预编译。
    【解决方案2】:

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

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

    $ python setup.py --help-commands
    

    注意各种不同的 bdist 类型。

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

    此时鸡蛋在很大程度上已经过时。编辑:鸡蛋不见了,它们与已从 Python 中删除的命令“easy_install”一起使用。

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

    您是否创建 sdist 或 egg(或 wheel)与您是否能够声明包具有的依赖项(由 PyPI 在安装时自动下载)无关。要使这个依赖功能起作用,您只需使用 distribute(setuptools 的继承者)或 distutils2(distutils 的继承者)提供的额外 API 声明依赖项- 在 Python 3.x 的当前开发版本中也称为 packaging

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

    【讨论】:

    • 链接好像有一段时间没有更新了。有没有更新的材料?
    • @Jean-PaulCalderone bdist 和 sdist 是否相同?
    • 他们不完全。 sdist 是一个“源分发”。 bdist 是“二进制分布”。对于一个纯 Python 项目,这些事情非常接近。但是,如果您的项目包含任何扩展模块,则 sdist 包含这些扩展模块的源代码,并且使用 sdist 将需要编译器。 bdist 包括这些扩展模块的编译形式,不需要编译器,但只能在与您创建 bdist 的系统非常接近的系统上运行(在 Linux 上通常需要相同的 distro ,例如)。
    • @Jean-PaulCalderone,假设我必须将一些图像与 Python 文件一起分发,因为我的 py 文件使用图像作为输入。当我使用 sdistbdist 选项时,两者都只包含 python 文件。如何将图像与 python 文件一起打包?
    • 您必须指定要包含的文件。 stackoverflow.com/questions/48696115/…
    猜你喜欢
    • 2011-05-09
    • 2012-07-12
    • 2011-01-12
    • 2011-02-17
    • 2017-03-08
    • 1970-01-01
    • 2011-04-23
    • 2016-03-03
    • 2013-05-22
    相关资源
    最近更新 更多