目前 Python 官方有一个专门的小组来负责 Python 打包的相关事宜。
该小组的名称叫做 : Python Packaging Authority (PyPA)
PyPA 小组的项目主页在 Github PyPA 和 Bitbucket PyPA 上都有。
Note
这两个项目主页是不一样的,分管不同的工具集 / 项目。
PyPA 小组还维护一份官方文档 Python Packaging User Guide ,如果读者有兴趣对 Python 的打包进行深入了解,可以参考该文档。
distutils
该跨平台的打包与发布工具是在 2000 年底时加入到 Python 标准库的,目前属于 Python 官方的打包工具。
但是由于它加入的时间太久远了,同时也未跟上时代的发展,所以目前它只适用于非常简单的应用场景。
distutils2
它本来应该成为 Python3 的标准库 packaging 。
Tip
在其它 Python 版本里叫做 distutils2 。
该项目在 2012 年已经停止了,官方文档建议使用 setuptools + pip,以下为原文:
tl;dr: keep using setuptools and pip for now, don’t use distutils2.
至于为什么会被停止,可以查看 Status of packaging in 3.3
setuptools
- setuptools 是对 distutils 的增强 , 尤其是引入了包依赖管理。
- setuptools 可以为 Python 包创建 egg 文件。
- 包含包目录内的数据文件。
- 自动包含包目录内的所有的包,而不用在 setup.py 中列举。
- 自动包含包内和发布有关的所有相关文件,而不用创建一个 MANIFEST.in 文件。
- 自动生成经过包装的脚本或 Windows 执行文件。
- 支持 Pyrex,即在可以 setup.py 中列出 .pyx 文件,而最终用户无须安装 Pyrex。
- 支持上传到 PyPI。
- 可以部署开发模式,使项目在 sys.path 中。
- 用新命令或 setup() 参数扩展 distutils,为多个项目发布 / 重用扩展。
- 基本满足大型项目的安装和发布。
setuptools 还有很多强大且优秀的功能,具体可参见其官方文档 Setuptools Docmentation
distribute
- 由于 setuptools 初期开发进度缓慢 , 不支持 Python3, 代码混乱 , 一帮程序员另起炉灶 , fork 并且重构 setuptools 代码 , 增加功能。
- 然后 2013 年 8 月,distribute 又合并回 setuptools 0.7,并且不再进行维护了。
以下为官方文档中的原话 :
Distribute is a deprecated fork of the Setuptools project. Since the Setuptools 0.7 release, Setuptools and Distribute have merged and Distribute is no longer being maintained. All ongoing effort should reference the Setuptools project and the Setuptools documentation.
easy_install
- setuptools 和 distribute 自带的安装脚本。
- 只支持从 PyPI 下载安装 Python 包。
pip
pip 的目标非常明确:取代 easy_install。
- 支持安装、卸载包。
- 支持从任意能够通过 VCS 或浏览器访问到的地址安装 Python 包。
pip 的功能也是同样优秀且强大的,具体可参见其官方文档 PIP Documentation
pypiserver
它是一个适配 PyPI 的最小集服务器。
如果你想要自己搭建一个简单的 PyPI 服务器,用它最适合不过了。
1 2 3 4 5 6 7 | $ pip install pypiserver
$ mkdir ~/packages
$ # 将 Python 包复制到 ~/packages 目录中
$ pypi-server -p 8080 ~/packages
|
通过以上的步骤,就搭建了一个 PyPI 服务器了,从该服务器安装 Python 包也很简单。
1 | $ pip install -i http://localhost:8080/simple/ 包的名称
|
想进一步了解可参见 pypiserver documentaton
devpi
devpi 相对于 pypiserver 来说,功能更丰富,可以说是 pypiserver 的超集。
当启动 devpi 服务后,你可以直接指定 pip 通过 devpi 服务来进行 Python 包的安装。
1 2 3 4 5 | $ pip install -q -U devpi-server
$ devpi-server --start
$ pip install -i http://localhost:3141/root/pypi/ simplejson
|
devpi 会自从其它 PyPI 服务器(默认为官方服务器)来下载 Python 包,并缓存下来。
当它处在离线状态时,它会直接将缓存中的 Python 包反馈给你。
当它牌在线状态时,它会自动在后台更新缓存的中的 Python 包,并将最新的 Python 包反馈给你。
当然上面只是对它作的一个简单的介绍,更多功能请参见其官方文档 devpi documentation