Python 打包一开始可能有些难以理解,其主要原因是不了解创建 Python 包的正确工具。但不管怎样,一旦创建好第一个包,就会发现其实它并没有想象的那么难。
即便你对将代码开源分发不感兴趣,也应该知道如何创建一个完整的包,因为这可以让你深入了解打包生态系统,有助于使用 PyPI 上可用的第三方代码。此外,将闭源项目或者其组件编程源代码发行包,有助于你在不同的环境中部署代码。
Python 打包曾经在很长一段时间内处于混乱不堪的状态,人们花了很多年才使其重新变得有组织。
一切都从 1998 年引入的 distutils 包开始,随后在 2003 年对 setuptools 进行改进,这两个项目开启了一段漫长而又纠结的故事,包括派生(fork),替代项目与完全重新编写,都想要彻底修复 Python 的打包生态系统。
然而不幸的是,大部分尝试非但没有成功,每个想要取代 setuptools 或 distutils 的新项目都只是给打包工具十分混乱的状态添乱而己。其中,有些派生被合并回它们的祖先中(例如 setuptools 派生的 distribute),有些则直接被弃用(distutils2)。
这种混乱的状态直到成立了被称为 Python Packaging Authority(简称 PyPA)的组织,将秩序和组织性带回到打包生态系统中。PyPA 维护的 Python 打包用户指南(Python Packaging User Guide)是关于最新打包工具和最佳实践的权威信息来源。
这份指南包含详细的历史变化以及与打包相关的新项目,因此,如果你已经了解一些内容,但想要确保使用的是正确的工具,那么这份指南是很有用的。
PyPA 除了提供一份权威的打包指南之外,还维护着打包项目与新的官方打包的标准化过程,前面章节中己经提到过其中一些项目,最有名的例如 pip、virtualenv、twine 和 warehouseo。
有兴趣的读者可参阅 PyPA 官方网站做详细了解。
注意,其中大部分项目都是在这个组织之外开始的,只是作为一个成熟且广泛使用的解决方案迁移到 PyPA 下而已。
由于 PyPA 的参与,构建发行版已经正在逐步弃用 egg 格式,而是支持使用 wheel 格式,未来可能会带来全新的方法。另外,PyPA 正在积极开发 warehouse,其目的是完全替代当前的 PyPI 实现,这将是打包历史上迈出的一大步,因为 PyPI 是如此古老且被忽视的项目。
Python 打包用户指南有关使用包的推荐工具给出了一些建议。这些工具大体可分为两组,分别是用于安装包的工具和用于包的创建与分发的工具。
PyPA 推荐用于安装包的工具:
PyPA 推荐包的创建与分发的工具如下: