python - distribute, distutils, setuptools 和distutils2之间的差异?

  显示原文与译文双语对照的内容

这种情况

我正试图将一个open-source库移植到 python 3 。 ( SymPy,如果有人想知道的话) 。

于 python 相关那样我就得先运行 2to3 建筑物时自动应用 为此,我需要使用 distribute 。 因此,我需要移植当前系统,( 根据 doctest ) 是 distutils


问题

不幸的是,我不确定这些 modules— distutilsdistributesetuptools 之间的区别。 起,所以forth,太粗略的文档作为最好的,因为他们都似乎可以算是彼此,在大多数环境中预期的漆应( 但实际上不是全部) - - 和太严重。


这个问题

有可能有人解释了这些差异? 我应该使用什么? 最现代的解决方案是什么? ( 顺便说一下,我还会欣赏到移植到 distribute的一些指南,但这超出了问题的范围。)

时间:

对于 2014年09月,这个问题的所有其他答案都是一个年份 out-of-date 。 当你遇到关于 python 打包问题的建议时,请记住查看发布的日期,而不信任out-of-date信息。

Readthedocs值得上一个 read, python 包装用户指南 hosted. 每个页面都显示了一个"上次审阅"日期,所以你可以检查手册的最新版本,它是相当全面的。 官方 python 3.4文档现在链接到这个资源,只是为了增加信任。

工具摘要:

以下是 python 中的打包景观摘要:

  • Distutils 仍然是标准的工具,用于包装去掉 它包含在标准库( python 2和 python 3.0到 3.4 ) 中。 它对于简单的python 分布很有用,但缺少特性。 在你 setup.py script,它介绍了 distutils python 包,可以 imported.

  • 为克服 Distutils'限制,开发了英镑 Setuptools,并不包含在标准库中。 它引入了一个command-line工具,叫做 easy_install 。 它还引入了带有 distribution, setuptools python 包,它可以在你 setup.py 脚本,和技术引进 pkg_resources python 包,在代码中可以导入用于查找数据文件 installed. 它的一个缺点是它 monkey-patches distutils python 包。 它应该与 pip 工作良好。 最新版本在 2014年08月 中发布。

  • 分配是一个Setuptools的分支。 它共享相同的名称空间,所以如果你已经安装了,import setuptools 实际上会导入分发的分发包。 分发被合并回设置工具 0.7,所以你不需要使用分发的更多。 实际上,Pypi上的版本只是一个安装了Setuptools的兼容层。

  • Distutils2 是一个试图充分利用 Distutils,Setuptools和发行版,并成为 python 库标准的标准工具。 想法是Distutils2将被分配给旧的python 版本,而Distutils2将被重命名为 python 3.3的packaging,它将包含在标准库中。 这些计划还没跳的是否按预期方式执行,但是,就目前 Distutils2是一个废弃的项目 。 最新版本在 2012年03月 中,它的Pypi主页最终被更新以反映它的死亡。

  • Distlib 是一个工具,它旨在实现以前工具功能的子集,但只有在接受的pep中定义非常明确的功能。 它应该最终包含在 python 标准库中。 于最终用户yet,相关 它仍在开发中,因此不推荐使用。

  • 为地面 up, 便当是一种包装方案,用于替换 Distutils,设置工具,分发和 Distutils2,written. 它的主要开发者也是 numpy/scipy的核心开发者,因此他熟悉 non-simple use-cases打包系统。 它的第一个提交是在 2009年10月 中,最新的提交是在 2014年08月 中进行的,但是作者并没有相应地更新它的Pypi页面。 它正处于活跃的开发但还但还没有完全成熟, 还并不是尽可能广泛称为设置工具。

推荐:

所以我建议将设置工具,总之,所有这些选项,中输出,除非你要求非常基础,你只需要 Distutils 。 Setuptools与 virtualenv 和Pip很好地工作,我极力推荐的工具。

作为一个 side-note,我建议使用 virtualenv 1.10或者更高版本,因为它是识别/分布式合并的第一个版本,对于 python 2和 3 。

我是一个distutils维护者和 distutils2/打包贡献者。 我做了一个谈论 python 包装在 ConFoo 2011和这几天我在写一个扩展的版本而已。 它还没有发布,所以这里有一些可以帮助你定义事物的摘录。

  • 英镑是用于打包的标准工具。 对于简单的需求,它工作得相当好,但它是有限的,而且不容易扩展。

  • 设置工具是一个项目从的愿望中诞生,以填补缺少的distutils的功能,并探索新的方向。 在某些subcommunities中,它是一个标准的标准。 它使用了monkey-patching和魔术,python 核心开发者对它的不满。

  • 分发是一种叉的设置工具,它是由开发者滋味是它的启动开发步伐太缓慢了和前,没有继续发展它。 当distutils2由同一个组启动时,它的开发速度大为减慢。 2013 -August更新:分发被合并回setuptools并停止。

  • Distutils2 是一种新型distutils库,最初是作为系统的一个分支distutils的代码库,而好的想法来自于设置工具( 其中一些在pep中被深入讨论) 和一个基本的安装程序灵感来自近端指间。 中的实际名称你用来导入Distutils2是 packaging python 3.3 2.4 + 和中+ 标准库或者 distutils2 3.1 –3 。2. ( backport将很快可用。) Distutils2没有制作 python 3.3版本,它被挂起。

更多信息:

我希望能完成我的向导很快它就会包含每个强大的图书馆和薄弱环节和一个转换指南的相关详情。

注意:回答过时,立即分发已经过时。

是的,你已经知道了。-o现在认为首选的软件包是分布的,这是setuptools的一个分支,它是 distutils ( 原始包装系统)的一个扩展。 没有维护 Setuptools,所以它是分叉和重命名的,但是在安装时,它使用了Setuptools的软件包名 ! 我认为大多数 python 开发人员现在都使用了分发,我可以肯定我做了。

我意识到我已经回答了你的次要问题,但在你最初的问题中没有回答毫无疑问的假设:

我正在尝试将open-source库( SymPy,如果有人想) 移植到 python 3 。 于 python 相关要做到这一点,我需要运行 2建筑物为3 时自动应用

你可能,不是需要 。 其他策略在 http://docs.python.org/dev/howto/pyporting 编辑器中描述

要做到这点,我需要使用分发,

你以一个不同的方式,它的distribute,: 可能: ) distutils支持 build-time 2到3 转换为代码( 非字母字符串) 。 http://docs.python.org/dev/howto/pyporting#during-installation

这个主题似乎仍在使用中。 在 10 -31-2013中,"python 打包用户指南"快速建议定义"目前推荐使用什么工具集"。 它还链接到"的未来打包 python 打包"

在 2014后期更新这个问题,幸运的是,python 包管理器已经很好地清理了打包混乱。

特别是,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和系统级库

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

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

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

...