Differences between distribute, distutils, setuptools and distutils2?
我正在尝试将一个开源库移植到python3。(辛菲,如果有人想知道的话。)
所以,我需要在为python3构建时自动运行
不幸的是,我不知道这些模块之间的区别是什么——
有人能解释这些区别吗?我应该用什么?最现代的解决方案是什么?(顺便说一句,我也很欣赏一些关于移植到
截至2017年1月,该问题的所有其他答案均已过期至少两年。当您遇到关于Python打包问题的建议时,请记住查看发布日期,不要信任过期的信息。好的。
python packaging用户指南值得一读。每一页都会显示"上次审阅"的日期,因此您可以查看手册的最新版本,而且它非常全面。它在Python软件基金会的Python .Org的子域上托管的事实只是增加了信任。项目摘要页面在这里特别相关。好的。工具摘要:
以下是2017年1月的python打包环境总结:好的。支持的工具:
distutils仍然是用python打包的标准工具。它包含在标准库中(python2和python3.0到3.6)。它对于简单的Python发行版很有用,但缺少特性。它引入了可以在您的
setup.py 脚本中导入的distutils python包。好的。- python package用户指南的official docs_
distutils 部分
- python package用户指南的official docs_
SETUPTOOLS是为了克服distuils的局限性而开发的,不包括在标准库中。它引入了一个名为
easy_install 的命令行实用程序。它还介绍了可以在您的setup.py 脚本中导入的setuptools python包,以及可以在代码中导入的pkg_resources python包,以定位安装了分发版的数据文件。它的一个优点是它monkey修补了distutils python包。它应该和pip 很好地配合。它会定期发布。好的。- 官方文档pypi page github repo
setuptools section of python package user guide.>sub>
- 官方文档pypi page github repo
SciKit构建是一个改进的构建系统生成器,内部使用cmake构建编译的Python扩展。因为scikit构建不是基于distutils的,所以它实际上没有任何限制。当存在忍者版本时,Scikit版本可以比其他版本更快地编译大型项目三倍。它应该和
pip 很好地配合。它会定期发布。好的。- 官方文件pypi page github repo
弃用/废弃工具:
分发是安装工具的一个分支。它共享相同的名称空间,因此如果您安装了distribute,那么
import setuptools 实际上会导入使用distribute分发的包。Distribute已合并回SetupTools 0.7,因此您不再需要使用Distribute。实际上,pypi上的版本只是安装安装安装工具的兼容层。好的。distuils2试图利用distuils、setuptools和distribute中的优势,并成为Python标准库中包含的标准工具。其想法是,distuils2将针对旧的Python版本进行分发,distuils2将被重命名为针对Python3.3的
packaging ,该版本将包含在其标准库中。然而,这些计划没有按预期进行,目前distutils2是一个废弃的项目。最新的版本是在2012年3月,它的Pypi主页最终被更新以反映它的死亡。好的。
Alpha软件:
distlib是一个旨在实现先前工具功能的子集的工具,但仅限于在公认的PEP中定义得很好的功能。它是pypa(python package authority)的一个工具,希望有一天它最终能够包含在python标准库中。它仍然被认为是阿尔法软件,所以最终用户要小心。好的。
- 官方文档pypi page bitback repo
distlib section of python package user guide.>sub>
- 官方文档pypi page bitback repo
还有一些工具(如:便当),但我不会提及它们,因为它们太模糊、太利基、太早或太不发达,不适合这个答案,否则它们不是直接的替代品。好的。
建议:
因此,总之,在所有这些选项中,我建议使用安装工具,除非您的需求非常基本,并且您只需要distuils。安装工具与virtualenv和pip(我强烈推荐的工具)配合得很好。virtualenv和pip都可以被认为是正式的,因为它们是pypa的一部分,而python 3现在提供了
如果你研究的是virtualenv,你可能会对这个问题感兴趣:
作为附带说明,我建议使用virtualenv 1.10或更高版本,因为它是第一个承认针对python 2和3的setuptools/distribute合并的版本。好的。好啊。
我是distuils维护人员和distuils2/包装贡献者。我在2011年的Confoo大会上做了一个关于Python打包的讨论,现在我正在编写一个扩展版本。它还没有出版,所以这里有一些摘录应该有助于定义事物。
distutils是用于包装的标准工具。对于简单的需求,它工作得相当好,但是它是有限的,而且扩展起来并不容易。
SETUPTOOLS是一个项目,源于对填补缺少的distuils功能和探索新方向的渴望。在一些小城市,这是一个事实上的标准。它使用了Python核心开发人员不喜欢的猴子补丁和魔法。
Distribute是安装工具的一个分支,开发人员认为它的开发速度太慢,不可能进行改进。当distutils2由同一组启动时,其开发速度明显减慢。2013年8月更新:Distribute重新合并到SetupTools中并停止使用。
distuils2是一个新的distuils库,开始时作为distuils代码库的一个分支,从安装工具(其中一些在PEPS中进行了详细讨论)中获得了好的想法,并且是一个受PIP启发的基本安装程序。
用于导入distutils2的实际名称是python 3.3+标准库中的packaging ,或2.4+和3.1–3.2中的distutils2 。(很快就会有一个backport可用。)distutils2 did not make the python 3.3 release,and it was put on hold.
更多信息:
- Distutils的命运–Pycon Summit+Packaging Sprint详细报告
- distuils和distuils2之间的快速差异
我希望尽快完成我的指南,它将包含关于每个图书馆的强项和弱项的更多信息,以及一个过渡指南。
注意:答案已弃用,分发现已废弃。
是的,你明白了。:-o我认为此时首选的包是分布式的,它是SETUPTOOLS的分支,是distutils(原始打包系统)的扩展。安装工具未被维护,因此被分叉并重命名,但安装时使用安装工具的包名称!我认为大多数Python开发人员现在都使用distribute,我可以肯定地说我使用distribute。
许多人抱怨在这个问题上缺乏明确的社区指导。
目前,这似乎是关于工具建议的最佳权威来源:https://packaging.python.org/en/latest/current.html工具建议
在2014年底更新这个问题,幸运的是,Continuum的"Conda"包管理器已经大大清理了python的打包混乱。
特别是,Conda可以快速创建Conda"环境"。您可以使用不同版本的python配置您的环境。例如:
将使用不同版本的python创建两个("py34"或"py26")python环境。
然后,您可以使用特定版本的python调用环境:
在必须处理不同版本的Python的情况下,此功能似乎特别有用。
此外,康达还具有以下特点:
- Python不可知论者
- 跨平台
- 不需要管理员权限
- 智能依赖性管理(通过SAT解决方案)
- 可以很好地处理C、Fortran和系统级库,这些库可能需要与之链接
最后一点在科学计算领域尤为重要。
我认识到,我回答了你的第二个问题,但没有回答你最初问题中的毫无疑问的假设:
I'm trying to port an open-source library (SymPy, if anyone is wondering) to Python 3. To
do this, I need to run 2to3 automatically when building for Python 3.
你可以,不需要。其他策略在http://docs.python.org/dev/howto/pyporting中介绍。
To do that, I need to use distribute,
您可以:)distutils支持代码(而不是docstrings)的构建时2to3转换,其方式与安装期间分发的方式不同:http://docs.python.org/dev/howto/pyporting
这个主题似乎还在不断变化。截至2013年10月31日,"python packaging用户指南"快速建议定义了"当前推荐的工具集"。它曾经链接到"Python打包的未来",现在是2019年1月20日,5年后,一个死链接。:)