、概述

在学习Python的过程中,安装第三方类库是非常常见的操作,这也是Python得以盛行的重要原因之一。在这个过程中,也许大家会遇到过类似 distutils、setuptools、distribute、pip等词汇,也困惑eggs、wheel究竟是什么?今天就让我们一起来捋一捋它们的关系。

2、Python包安装过程

pip install requests 检查待安装模块是否已经安装,如果没有则进入步骤2。查看本地缓存文件是否已经下载Python模块安装文件,如果没有,则尝试连接PyPI并下载最新版本模块(如果没有指定版本号,指定版本号则下载相应版本模块),否则跳过下载过程。安装本模块之前,查看该模块的依赖模块,如果依赖关系不为空,则递归进入步骤1。直到依赖模块全部安装成功后,进入本模块的升级流程。模块升级过程中,主要把原代码解压到 site-packages 目录下。部分模块在安装过程中有其他操作暂不在本节讨论。PyPI(Python Package Index)是python官方的第三方库的仓库,所有人都可以下载第三方库或上传自己开发的库到PyPI。

3、包管理工具路线图

在Python包安装过程中,我们得以通过一个pip命令就完成如此复杂的操作,得益于包管理工具。包管理工具是为了管理、安装和发布Python包而开发的,这些包管理工具的作用就是安装、管理和发布Python包以及Python的一些项目。那么Python包管理工具在Python发展的历程中都经历了哪些呢?

3.1 distutils 于2000年发布,当时作为Python标准库的一部分进行Python模块的安装与发布。

3.2 setuptools 于2004年发布,为增强 distutils (主要体现在对依赖的处理)而开发的集合或项目包含了 easy_install 工具。通过 setuptools 可以自动下载、构建、安装和管理Python模块。

3.3 distribute 是 setuptools 的一个分支版本。分支的原因可能是有一部分开发者认为 setuptools 开发太慢了。但现在,distribute 又合并回了 setuptools 中。

3.4 distutils2

distutils2 是 distutils 的替代品,从2009年的开发到2012年的完成。它包含更多的功能,并希望在 Python 3.3

中以 packaging 作为名称成为标准库的一部分。然而,这个计划后来停滞了。

3.5 distlib

distlib 是 distutils2 的部分,它为 distutils2/packaging 提供低级功能,并添加高级 API,使其易于使用。

3.6 eggs

eggs 格式是 setuptools 引入的一种 Python 软件安装包格式,使用 egg 扩展名(本质上是一个 zip 包)。setuptools

(easy_install)可以解析并安装 eggs。Eggs 对 Python 的作用类似于 Java 中的 Jars。

3.7 pip

pip 是当前 Python 包管理的标准工具,于2008年发布。它被用作 easy_install 的替代品。与 easy_install 相比,pip 希望不再支持

eggs(尽管仍然支持),而更倾向于采用“源码发行版”。

3.8 wheel

wheel 是 Python 软件安装包格式的一种,使用 whl 扩展名(本质上是一个 zip 包),也是目前 Python 官方推荐的项目发布格式。与

eggs 相比,wheel 具有以下优势:

- 不包含 pyc 文件(预编译的 pyc 可能经常出现奇怪的问题)

- 官方支持,pip 命令可以直接安装 wheel

- 单文件安装,无需本地再次编译文件即可直接安装

- 依赖处理,自动安装依赖的类库。

- 二进制发布格式(可以将 so/dll/dylib 等打包在一起)。

4、小结

充分了解各种包管理工具后,我们才能有的放矢地使用它们,更好地利用这些工具来管理我们的 Python 项目。