Python打包的艺术(一)- 综述
By
Harrison Feng
Python打包的艺术是一个专题,我将在这个专题里分享自己对构建、管理和发布Python软件包的理解。这个专题
将涉及几个Python模块,他们分别是distutils,setuptools,distribute,pip,virtualenv等。
任何一门开源的程序设计语言都会有自己一套创建、管理和发布软件包的标准。有了这套标准,开发者才能更容易的
发布自己开发的模块或者软件包,而用户也能更容易安装和使用这些发布到社区的模块和软件包。很显然,这些模块
和软件包应该是放到一个集中的地方共享给供全世界的爱好者和用户使用。这些被Perl语言的开发者描述为“社会因素
(Social Factors)”。在Python发展的初期,它是欠缺这种“社会因素”的。
很快,由Tim Middleton 建立的Vaults
of Parnassus网站改进了Python的社会基础。Vaults of Parnassus使得Python
开发者第一次拥有了一个集中、专门的地方来共享和下载所有已发布的第三方模块、软件包和工具。由于Vaults of
Parnassus由Tim手工维护,且网站只是指向实际的资源位置,并不作为实际资源的镜像。网站更新比较慢,有时还断线。
这些缺点慢慢就凸显出来了。随着越来越多的开发者开始使用Python开发自己的模块、包或工具,Python太需要像Perl
的CPAN这样的“社会因素”的诞生了。于是乎, (也叫 -- 开始被叫作Python的"Cheese Shop")
应运而生。PyPI成了强大的Python社区的架构基础,全世界的开发者都可以在PyPI共享自己开发的模块或软件包,也能
找到自己所需要的模块和包。开发者不需要重新发明轮子,这里用最完美的方式诠释了共享与贡献的含义与关系。但是
想要这种社会因素变的繁荣,丰富并快速发展,一套完整而优秀的创建、管理模块和包的标准是必不可少的。
最早的发布Python模块和包的库是distutils, 它现在已是Python的标准库。如果你想详细了解distutils,请参看Python官
方文档里由Greg Ward撰写的。在这里我们要来看的是被看作是distutils的扩展或者说是
替代品的。
熟悉Python的人都知道setuptools被人认为是Python distutils库的加强和扩展的合集,它可以让开发者更容易的构建
和发布Python软件包,并添加了包的版本化和依赖性管理。而且setuptools还可以将你开发的Python模块打包成一个后
缀为“.egg”的文件,用于发布和安装。因为setuptools是基于distutils的,所以完全兼容用distutils构建的包。
提到setuptools,我们不得不提easy_install,和pip。那么三个工具又是做什么的的呢?它们和setuptools之间
又有什么关系呢?
easy_install其实就是绑定在setuptools里的一个模块,让开发者可以自动的下载,构建,安装和管理Python软件包。我们
完全可以把它看做是调用setuptools的一个命令。有了这个命令我们就可以自如的使用setuptools的功能。
Distribute则是从setuptools分支(fork)出来的一个项目,目的是为了替换setuptools作为Python模块发布的标准方法。
不过要注意的是Distribute是setuptools的drop-in(嵌入式)替代品。也就是说Distribute到某个时候会merge回到setuptools
里。在s
etuptools 0.7, Distribute就被merge进入到了setuptools,现在setuptools最新的版本已是1.0。
pip可以被认为是easy_install的超级加强版。它不再绑定到setuptools,是个独立的项目,但是它也依然依赖于setuptools。
下面的图诠释了它们过去,现在和未来的关系。
最终,distribute和pip都应该会成为Python的标准库,从而成为Python打包的标准。
下面的图是来自的一个announcement。
最终,distribute将会取代setuptools,而pip会取代easy_install。我相信distribute和pip最终应该能成为标准的Python库。
下一篇将分享怎样打包Python项目。
By
Harrison Feng
Reference:
setuptools:
Project Page:
Documentation:
distribute:
Project Page:
Documentation:
pip:
Project Page:
Install howto:
阅读(8598) | 评论(4) | 转发(6) |