VPe*_*ric 588 python packaging distutils setuptools distribute
我正在尝试将一个开源库移植到Python 3.(SymPy,如果有人想知道的话.)
所以,我需要2to3
在为Python 3构建时自动运行.为此,我需要使用distribute
.因此,我需要移植当前系统(根据doctest)distutils
.
不幸的是,我不知道什么是这些模块-之间的区别distutils
,distribute
,setuptools
.文档是最好的粗略,因为它们似乎都是彼此的分支,旨在在大多数情况下兼容(但实际上,不是全部)......等等.
有人可以解释这些差异吗?我应该用什么?什么是最现代的解决方案?(Distribute
顺便说一句,我也很欣赏一些关于移植的指南,但这有点超出了问题的范围......)
Fli*_*imm 824
截至2017年1月,此问题的所有其他答案至少已过期两年.当您遇到有关Python打包问题的建议时,请记住查看发布日期,并且不要信任过时的信息.
在Python的包装用户指南值得一读.每个页面都显示"上次审核"日期,因此您可以查看手册的新近度,并且它非常全面.事实上,它托管在Python软件基金会的python.org的子域上,只是增加了它的可信度.该项目总结页面是特别与此有关.
以下是2017年1月Python包装环境的摘要:
Distutils仍然是Python中打包的标准工具.它包含在标准库(Python 2和Python 3.0到3.6)中.它对于简单的Python发行版非常有用,但缺少功能.它介绍了distutils
可以在setup.py
脚本中导入的Python包.
Setuptools的开发是为了克服Distutils的局限性,并未包含在标准库中.它引入了一个名为的命令行实用程序easy_install
.它还介绍了setuptools
可以在setup.py
脚本中导入的pkg_resources
Python包,以及可以在代码中导入的Python包,用于查找随分发安装的数据文件.其中一个问题是它可以修补distutils
Python包.它应该很好用pip
.它看到定期发布.
scikit-build是一个改进的构建系统生成器,它在内部使用CMake构建编译的Python扩展.因为scikit-build不是基于distutils,所以它实际上没有任何限制.当存在ninja-build时,scikit-build可以编译大型项目的速度比替代方案快三倍.它应该很好用pip
.它看到定期发布.
Distribute是Setuptools的一个分支.它共享相同的命名空间,因此如果安装了Distribute,import setuptools
实际上会导入随Distribute一起分发的包.分发已合并回Setuptools 0.7,因此您不需要再使用Distribute.事实上,Pypi上的版本只是一个安装Setuptools的兼容层.
Distutils2试图充分利用Distutils,Setuptools和Distribute,并成为Python标准库中包含的标准工具.想法是Distutils2将分发给旧的Python版本,并且Distutils2将被重命名packaging
为Python 3.3,它将包含在其标准库中.然而,这些计划没有按照预期进行,目前,Distutils2是一个废弃的项目.最新版本于2012年3月发布,其Pypi主页终于更新以反映其死亡.
Distlib是一个旨在实现以前工具功能的子集的工具,但只有在接受的PEP中定义得非常好的功能.它是PyPA(Python Package Authority)的工具之一,有希望有一天它最终会被包含在Python标准库中.它仍然被认为是alpha软件,所以最终用户要小心.
还有一些工具(例如:Bento),但我不会提及它们,因为它们对于这个答案帖子来说太过模糊或利基或早期或未开发,否则它们不是直接替代品.
总而言之,在所有这些选项中,我建议使用Setuptools,除非您的要求非常基本且只需要Distutils.Setuptools与Virtualenv和Pip非常合作,我强烈推荐这些工具.Virtualenv和Pip都可以被认为是官方的,因为它们是PyPA的一部分,而Python 3现在出货ensurepip
(它可以帮助您pip
在某些系统上安装).
如果你正在寻找进入VIRTUALENV,你可能有兴趣在这样一个问题:是什么区别venv
,pyvenv
,pyenv
,virtualenv
,virtualenvwrapper
,等?.(是的,我知道,我和你一起呻吟.)
作为附注,我建议使用Virtualenv 1.10或更高版本,因为它是第一个识别用于Python 2和3的Setuptools/Distribute合并的版本.
Éri*_*ujo 251
我是distutils维护者和distutils2 /包装贡献者.我在ConFoo 2011上谈了Python包装,现在我正在编写它的扩展版本.它还没有发布,所以这里有摘录应该有助于定义事物.
Distutils是用于包装的标准工具.它对于简单的需求非常有效,但是有限且不易于扩展.
Setuptools是一个渴望填补缺失的distutils功能并探索新方向的项目.在一些子社区中,它是事实上的标准.它使用了猴子修补和魔术,这是Python核心开发人员所不喜欢的.
Distribute是Setuptools的一个分支,由开发人员发现它的开发速度太慢并且无法进化它.当distutils2由同一组开始时,它的发展相当缓慢.2013年8月更新:分发合并回setuptools并停止.
Distutils2是一个新的distutils库,作为distutils代码库的一个分支,从设置工具(其中一些在PEP中进行了彻底讨论)中获得了很好的想法,以及受pip启发的基本安装程序. 用于导入Distutils2的实际名称 Distutils2没有发布Python 3.3,它被搁置了.packaging
在Python 3.3+标准库中,或者distutils2
在2.4+和3.1-3.2中.(很快就会有一个backport.)
更多信息:
我希望尽快完成我的指南,它将包含有关每个图书馆的优缺点和过渡指南的更多信息.
注意:不推荐使用的答案,现在分发已过时.
是的,你明白了.:-o我认为目前首选的软件包是Distribute,它是setuptools的一个分支,它是distutils(原始包装系统)的扩展.Setuptools没有被维护,因此被分叉并重命名,但是在安装时它使用了setuptools的包名!我认为大多数Python开发人员现在使用Distribute,我可以肯定地说我做了.