我正在尝试将一个开源库移植到 Python 3。(如果有人想知道,SymPy 。)
因此,在为 Python 3 构建时,我需要2to3自动运行。为此,我需要使用distribute. 因此,我需要移植当前系统,(根据 doctest)是distutils.
2to3
distribute
distutils
不幸的是,我不确定这些模块之间的区别是什么distutils,distribute… setuptools文档最好是粗略的,因为它们似乎都是彼此的一个分支,旨在在大多数情况下(但实际上,并非全部)兼容——等等。
setuptools
有人可以解释这些差异吗? 我应该用什么?什么是最现代的解决方案?(顺便说一句,我也很欣赏一些关于移植到的指南Distribute,但这有点超出了问题的范围——)
Distribute
截至 2020 年 3 月,这个问题的大多数其他答案都已经过时了好几年。当您遇到有关 Python 打包问题的建议时,请记住查看发布日期,不要相信过时的信息。
Python 打包用户指南值得一读。每个页面都显示了“最后更新”日期,因此您可以查看手册的新近度,并且非常全面。它托管在 Python 软件基金会的 python.org 子域上的事实只是增加了对它的信任。项目摘要页面在这里特别重要。
以下是 Python 打包环境的总结:
distutils 仍然是 Python 中打包的标准工具。它包含在标准库(Python 2 和 Python 3)中。它对于简单的 Python 发行版很有用,但缺少功能。它介绍了distutils可以在您的setup.py脚本中导入的 Python 包。
setup.py
setuptools 是为了克服 Distutils 的限制而开发的,并且不包含在标准库中。它引入了一个名为easy_install. 它还介绍了setuptools可以在您的setup.py脚本中导入的pkg_resourcesPython 包,以及可以在您的代码中导入的 Python 包,以定位随发行版安装的数据文件。它的问题之一是它对distutilsPython 包进行了猴子补丁。它应该与pip. 它看到定期发布。
easy_install
pkg_resources
pip
官方文档| Pypi 页面| GitHub 仓库| setuptoolsPython 包用户指南部分
scikit-build 是一个改进的构建系统生成器,它在内部使用 CMake 来构建已编译的 Python 扩展。因为 scikit-build 不是基于 distutils,所以它实际上没有任何限制。当存在 ninja-build 时,scikit-build 编译大型项目的速度比替代方案快三倍。它应该与pip.
scikit-build
官方文档| Pypi 页面| GitHub 仓库| scikit-buildPython 包用户指南部分
distlib 是一个提供更高级别工具(如pip.
distlib
官方文档| Pypi 页面| Bitbucket 存储库| distlibPython 包用户指南部分
packaging 也是一个库,提供更高级别工具使用的功能,例如pip和setuptools
packaging
官方文档| Pypi 页面| GitHub 仓库| packagingPython 包用户指南部分
distribute 是一个叉子setuptools。它共享相同的命名空间,因此如果您安装了 Distribute,import setuptools实际上会导入使用 Distribute 分发的包。 Distribute 已合并回 Setuptools 0.7 ,因此您不再需要使用 Distribute。其实Pypi上的版本只是安装了Setuptools的兼容层。
import setuptools
distutils2 是一次尝试充分利用distutils,setuptools并distribute成为 Python 标准库中包含的标准工具。这个想法是distutils2为旧的 Python 版本分发,然后distutils2将其重命名packaging为 Python 3.3,将其包含在其标准库中。然而,这些计划并没有按预期进行,目前 distutils2 是一个废弃的项目。最新版本是在 2012 年 3 月,它的 Pypi 主页终于更新以反映它的死亡。
distutils2
还有其他工具,如果您有兴趣,请阅读Python 打包用户指南中的项目摘要。我不会将它们全部列出,也不会重复该页面,并保持答案与问题相匹配,该问题仅是关于distribute,distutils和.setuptools``distutils2
setuptools``distutils2
如果所有这些对您来说都是新的,并且您不知道从哪里开始, 我建议您学习setuptools,以及pip和virtualenv,它们可以很好地协同工作。
virtualenv