4.1 简史

distutils自从1998年便已经是Python标准库的一部分了。它最早由Greg Ward开发,目的是要创造一种简单的方式供开发人员为最终用户自动化软件安装过程。

示例4.1 使用distutils的setup.py

广告:个人专属 VPN,独立 IP,流量大,速度快,连接稳定,多机房切换,每月最低仅 10 美元

#!/usr/bin/python
From distutils.core import setup

setup(name="rebuildd",
    description="Debian packages rebuild tool",
    author="Julien Danjou",
    author_email="acid@debian.org",
    url="http://julien.danjou.info/software/rebuildd.html",
    packages=['rebuildd'])

就这么简单。用户要生成或安装软件只需通过合适的命令运行setup.py即可。如果你的发布中包含了除原生Python之外的C语言模块,它甚至也可以自动处理。

distutils的开发在2000年就停止了。从那时起,一些开发人员开始在其基础上继续开发他们自己的工具。其中最成功的distutils的继任者便是打包库setuptools,它提供了更频繁的更新和更多的高级功能,如自动依赖处理、Egg分发格式以及easy*install命令。由于distutils仍然是包含在Python标准库中的软件打包的一种标准方式,因此setuptools也提供了一定程度上的向后兼容。

示例4.2 使用setuptools的setup.py

#!/usr/bin/env python
import setuptools

setuptools.setup(
  name="pymunincli",
  version="0.2",
  author="Julien Danjou",
  author_email="julien@danjou.info",
  description="munin client library",
  license="GPL",
  url="http://julien.danjou.info/software/pymunincli/",
  packages=['munin'],
  classifiers=[
    "Development Status :: 2 - Pre-Alpha",
    "Intended Audience :: Developers",
    "Intended Audience :: Information Technology",
    "License :: OSI Approved :: GNU General Public License (GPL)",
    "Operating System :: OS Independent",
    "Programming Language :: Python"
  ],
)

最终,setuptools的开发也变得缓慢了,因为人们开始认为它很可能像最早的distutils一样死去。于是,不久后另一伙开发人员又基于setuptools创建了一个新的名为distribute的库,它具有一些超越setuptools的优点,包括bug更少且支持Python 3。所有的好故事都有个曲折的结局,这个也不例外。2013年3月,setuptools和distribute两个开发组决定基于原始的setuptools项目合并他们的代码库(http://mail.python.org/pipermail/distutils-sig/2013-March/020126.html)。所以现在distribute已经被废弃,setuptools又重新成为处理高级Python安装的标准方式。

尽管这一切已经在发生,还是有另一个名为distutils2的项目在开发中,意欲全面取代Python标准库中的distutils。它与distutils和setuptools的最明显的区别是,它会将包的元数据存储在纯文本文件setup.cfg中,这使得开发人员写起来简单并且外部工具读取也容易。然而,它还是留有distutisl的一些缺陷,例如,晦涩的基于命令的设计,缺少对入口点(entry point)以及在Windows上执行原生脚本的支持,而这两个功能setuptools都支持。因为这些以及其他一些原因,最终在Python 3.3标准库中包含setuptools的计划再次落空,这一项目在2012年被废弃。

然而,packaging仍有机会通过distlib(https://readthedocs.org/projects/distlib/)涅槃重生,它正致力于取代distutils,并将(希望是)成为Python 3.4标准库的一部分。它包含来自packaging的最好的功能同时实现了与打包有关的PEP中描述的基本内容。

简单回顾一下。

 
  • distutils是标准库的一部分,能处理简单的包的安装。
  • setuptools,领先的包安装标准,曾经被废弃但现在又继续开发。
  • distribute从0.7版本开始并入了setuptools。
  • distutils2(也称为packaging)已经被废弃。
  • distlib可能将来会取代distutils。

尽管这5个打包工具是实际工作中最常见的,但还是有许多其他的打包库。在网上搜索相关信息要谨慎,正因为上述复杂的历史变迁,所以有大量的文档都是过期的。不过至少官方文档(http://pythonhosted.org/setuptools/)是最新的。

简而言之,setuptools是目前分发库的主要选择,但在未来要对distlib保持关注。