繁体   English   中英

分发、distutils、setuptools 和 distutils2 之间的区别?

[英]Differences between distribute, distutils, setuptools and distutils2?

情况

我正在尝试将开源库移植到 Python 3。( SymPy ,如果有人想知道的话。)

因此,在为 Python 3 构建时,我需要自动运行2to3 。为此,我需要使用distribute 因此,我需要移植当前系统,(根据 doctest)是distutils


问题

不幸的是,我不确定这些模块之间的区别是什么—— distutilsdistributesetuptools 文档最好是粗略的,因为它们似乎都是彼此的一个分支,旨在在大多数情况下兼容(但实际上,并非全部)......等等,等等。


问题

有人可以解释这些差异吗? 我应该用什么? 什么是最现代的解决方案? (顺便说一句,我也很欣赏一些关于移植到Distribute的指南,但这有点超出问题的 scope ......)

截至 2020 年 3 月,这个问题的大多数其他答案都已经过时了好几年。 当您遇到有关 Python 包装问题的建议时,请记住查看发布日期,不要相信过时的信息。

Python 包装用户指南值得一读。 每个页面都有显示的“最后更新”日期,因此您可以查看手册的新近度,并且非常全面。 它托管在 Python 软件基金会的 python.org 的子域上的事实只是增加了对它的信任。 项目摘要页面在这里特别重要。

工具总结:

以下是 Python 封装格局的总结:

支持的工具:

已弃用/废弃的工具:

  • distributesetuptools的一个分支。 它共享相同的命名空间,因此如果您安装了 Distribute, import setuptools实际上会导入与 Distribute 一起分发的 package。 Distribute 已合并回 Setuptools 0.7 ,因此您不再需要使用 Distribute。 实际上,Pypi 上的版本只是安装了 Setuptools 的兼容层。

  • distutils2试图充分利用distutilssetuptoolsdistribute并成为 Python 标准库中包含的标准工具。 这个想法是distutils2将为旧的 Python 版本分发,并且distutils2将重命名为 Python 3.3 的packaging ,它将包含在其标准库中。 这些计划没有按预期 go,但是,目前, distutils2是一个废弃的项目 最新版本是在 2012 年 3 月,它的 Pypi 主页终于更新以反映它的死亡。

其他:

还有其他工具,如果您有兴趣,请阅读 Python 打包用户指南中的项目摘要 我不会将它们全部列出,也不会重复该页面,并保持与问题相匹配的答案,这只是关于distributedistutilssetuptoolsdistutils2

推荐:

如果所有这些对您来说都是新的,并且您不知道从哪里开始,我建议您学习setuptools以及pipvirtualenv ,它们都可以很好地协同工作。

如果您正在研究virtualenv ,您可能会对这个问题感兴趣: venvpyvenvpyenvvirtualenvvirtualenvwrapper等有什么区别? . (是的,我知道,我和你一起呻吟。)

我是 distutils 维护者和 distutils2/packaging 贡献者。 我在 ConFoo 2011 上讨论了 Python 包装,这些天我正在编写它的扩展版本。 它还没有发布,所以这里有一些可以帮助定义事物的摘录。

  • Distutils是用于打包的标准工具。 它适用于简单的需求,但它是有限的,而且扩展起来并不简单。

  • Setuptools是一个出于填补 distutils 缺失功能和探索新方向的愿望而诞生的项目。 在某些子社区中,这是事实上的标准。 它使用了 Python 核心开发人员不喜欢的猴子补丁和魔法。

  • Distribute是 Setuptools 的一个分支,由开发人员开始,他们觉得它的开发速度太慢并且无法发展它。 当 distutils2 由同一组启动时,它的开发速度大大减慢。 2013 年 8 月更新:distribute 被合并回 setuptools 并停止。

  • Distutils2是一个新的 distutils 库,最初是 distutils 代码库的一个分支,其好主意取自安装工具(其中一些在 PEP 中进行了全面讨论),以及受 pip 启发的基本安装程序。 您用于导入 Distutils2 的实际名称是 Python 3.3+ 标准库中的packaging ,或 2.4+ 和 3.1–3.2 中的distutils2 (即将推出一个反向移植。) Distutils2 没有发布 Python 3.3 版本,因此被搁置。

更多信息:

我希望尽快完成我的指南,它将包含有关每个图书馆的强项和弱点的更多信息以及过渡指南。

许多人在这里抱怨在这个问题上缺乏明确的社区指导。

目前这看起来像是工具推荐的最佳权威来源: https://packaging.python.org/en/latest/current.html#tool-recommendations

注意:不推荐使用答案,现在分发已过时。 这个答案不再有效,因为 Python 包装管理局已经成立并且已经做了很多清理工作。


是的,你明白了。 :-o 我认为此时首选的 package 是Distribute ,它是 setuptools 的一个分支,是 distutils (原始打包系统)的扩展。 Setuptools 没有得到维护,因此被分叉并重命名,但是在安装时它使用 setuptools 的 package 名称,我认为大多数 Python 开发人员现在都使用 Distribute。 我可以肯定地说我愿意。

在 2014 年底更新了这个问题,幸运的是 Python 包装混乱已经被 Continuum 的“ conda ”package 经理大大清理了。

特别是,conda 可以快速创建 conda“环境”。 您可以使用不同版本的 Python 配置您的环境。 例如:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

将使用不同版本的 Python 创建两个(“py34”或“py26”)Python 环境。

之后,您可以使用特定版本的 Python 调用环境:

source activate <env name>

在您必须处理不同版本的 Python 的情况下,此功能似乎特别有用。

此外,conda 具有以下特点:

  • Python 不可知
  • 跨平台
  • 无需管理员权限
  • 智能依赖管理(通过 SAT 求解器)
  • 很好地处理您可能需要链接的 C、Fortran 和系统级库

如果您在科学计算领域,最后一点尤其重要。

我意识到我已经回答了您的第二个问题,但没有解决您原始问题中毫无疑问的假设:

我正在尝试将一个开源库(SymPy,如果有人想知道的话)移植到 Python 3。为此,我需要在为 Python 3 构建时自动运行 2to3。

可能不需要 http://docs.python.org/dev/howto/pyporting中描述了其他策略

为此,我需要使用分发,

可以:) distutils 支持代码(不是文档字符串)的构建时 2to3 转换,以不同的方式分发: http://docs.python.org/dev/howto/pyporting#during-installation

这个话题似乎还在不断变化。 截至 2013 年 10 月 31 日,“Python 打包用户指南”快速推荐定义了“当前推荐的工具集”。 它曾经链接到“Python 包装的未来”,现在,2019 年 1 月 20 日,5 年多后,这是一个死链接。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM