情况
我正在尝试将开源库移植到 Python 3。(SymPy http://sympy.org/,如果有人想知道的话。)
所以,我需要跑2to3
在为 Python 3 构建时自动进行。为此,我需要使用distribute
。因此,我需要移植当前系统,(根据文档测试)是distutils
.
问题
不幸的是,我不确定这些模块之间有什么区别 -distutils
, distribute
, setuptools
。该文档最好是粗略的,因为它们似乎都是彼此的分叉,旨在在大多数情况下兼容(但实际上不是全部)......等等,等等。
问题
有人可以解释这些差异吗?我应该用什么?最现代的解决方案是什么? (顺便说一句,我也希望获得一些有关移植到Distribute
,但这有点超出了问题的范围......)
截至 2022 年 5 月,这个问题的大多数其他答案都已经过时了好几年。当您遇到有关 Python 打包问题的建议时,请记住查看发布日期,不要相信过时的信息。
The Python 打包用户指南 https://packaging.python.org/值得一读。每个页面都会显示“最后更新”日期,因此您可以检查手册的最新情况,而且内容相当全面。事实上,它托管在 Python 软件基金会的 python.org 子域上,这更增加了它的可信度。这项目概要 https://packaging.python.org/en/latest/key_projects/页面在这里特别相关。
工具总结:
以下是 Python 打包环境的摘要:
支持的工具:
-
setuptools
是为了克服 Distutils 的限制而开发的,并且不包含在标准库中。它引入了一个名为的命令行实用程序easy_install
。它还介绍了setuptools
可以导入到你的Python包中setup.py
脚本,以及pkg_resources
可在代码中导入的 Python 包,以查找随发行版安装的数据文件。它的陷阱之一是它对distutils
Python 包。它应该可以很好地配合pip
. 它会定期发布。 https://github.com/pypa/setuptools/releases
- Official docs https://setuptools.readthedocs.io/en/latest/ | Pypi page https://pypi.python.org/pypi/setuptools | GitHub repo https://github.com/pypa/setuptools | setuptools section of Python Package User Guide https://packaging.python.org/key_projects/#setuptools
-
scikit-build
是一个改进的构建系统生成器,它在内部使用 CMake 来构建已编译的 Python 扩展。因为 scikit-build 不是基于 distutils,所以它实际上没有任何限制。当 ninja-build 存在时,scikit-build 编译大型项目的速度比替代方案快三倍以上。它应该可以很好地配合pip
.
- Official docs http://scikit-build.readthedocs.io/en/latest/ | Pypi page https://pypi.org/project/scikit-build/ | GitHub repo https://github.com/scikit-build/scikit-build | scikit-build section of Python Package User Guide https://packaging.python.org/key_projects/#scikit-build
-
distlib
是一个库,提供由更高级别的工具使用的功能,例如pip
.
- Official Docs http://pythonhosted.org/distlib/ | Pypi page https://pypi.org/project/distlib | Bitbucket repo https://bitbucket.org/pypa/distlib | distlib section of Python Package User Guide https://packaging.python.org/key_projects/#distlib
-
packaging
也是一个提供高级工具使用的功能的库,例如pip
and setuptools
- Official Docs https://packaging.pypa.io/ | Pypi page https://pypi.org/project/packaging | GitHub repo https://github.com/pypa/packaging | packaging section of Python Package User Guide https://packaging.python.org/key_projects/#packaging
已弃用/废弃的工具:
-
distutils
仍然包含在 Python 标准库中,但从 Python 3.10 开始被视为已弃用。它对于简单的 Python 发行版很有用,但缺乏功能。它介绍了distutils
可以导入到你的Python包中setup.py
script.
- Official docs https://docs.python.org/3/library/distutils.html | distutils section of Python Package User Guide https://packaging.python.org/key_projects/#distutils
-
distribute
是一个叉子setuptools
。它共享相同的命名空间,因此如果您安装了 Distribute,import setuptools
实际上会导入使用 Distribute 分发的包。Distribute 已合并回 Setuptools 0.7,因此您不再需要使用 Distribute。其实Pypi上的版本只是安装Setuptools的兼容层。
-
distutils2
是试图充分利用distutils
, setuptools
and distribute
并成为Python标准库中包含的标准工具。我们的想法是distutils2
将针对旧的 Python 版本进行分发,并且distutils2
将被重命名为packaging
对于 Python 3.3,它将包含在其标准库中。然而,这些计划并没有按预期进行,目前,distutils2
是一个废弃的项目。最新版本发布于 2012 年 3 月,其 Pypi 主页终于更新以反映其死亡。
Others:
还有其他工具,如果您有兴趣,请阅读项目概要 https://packaging.python.org/en/latest/key_projects/在 Python 打包用户指南中。我不会全部列出,以免重复该页面,并保持答案与问题相匹配,这只是关于distribute
, distutils
, setuptools
and distutils2
.
推荐:
如果这一切对你来说都是新的,并且你不知道从哪里开始,我会推荐学习setuptools
, 随着pip
and virtualenv
,所有这些都可以很好地协同工作。
如果你正在寻找virtualenv
,您可能对这个问题感兴趣:有什么区别venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, etc? https://stackoverflow.com/q/41573587/247696。 (是的,我知道,我和你一起呻吟。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)