一:简介
尽管Python标准库已经支持很多的功能,但是有时还是会需要以第三方模块的形式添加新的功能到Python中。
在最简单的场景中,是你要安装的模块,已经有了针对你的平台的安装版本,因此只需要像安装其他软件一样安装他们即可。比如针对Windows用户的安装程序,针对基于RPM的Linux用户的RPM包等等。这种情况,只需要将该安装包下载下来,直接安装即可,比如直接运行”rpm –install”。
当然,事情不会一直这么简单。更多的时候,是需要从一个源码发布包开始安装,但只要该模块是按照标准方式进行打包发布的,从源码发布进行安装也非常简单。
下载了一个模块的源码发布之后,可以使用Distutils简单的分辨出该模块是否是按照标准方式打包和发布的。第一,下载的包的名字通常包含了发布的名字和版本号,比如foo-1.0.tar.gz或者widget-0.9.7.zip;第二,解压之后,包含setup脚本setup.py,包含帮助文件README.txt或README等,该帮助文件说明构建和安装该模块发布的方法,Linux下就是运行命令:python setup.py install;Windows下则是:setup.py install
如果以上的条件都满足的话,那你已经知道了如何构建和安装下载的包了,直接运行上面的命令即可。除非你需要对构建过程进行定制,以非标准的方式安装,否则就不需要接着读本文档了。
二:标准构建和安装
标准的构建和安装过程,只需要运行命令python setup.py install即可。必须在发布的根目录运行该命令,也就是setup.py所在的目录。
比如,如果下载了源码发布文件foo-1.0.tar.gz,在Unix系统上,标准的做法是:
#gunzip -c foo-1.0.tar.gz | tar xf - # unpacks into directory foo-1.0
#cd foo-1.0
#python setup.py install
运行install命令,会依次执行构建和安装过程。当然也可以将其分步执行,比如可能需要将构建和安装交给不同的用户执行。下面的两条命令,首先是构建,然后就是安装:
python setup.py build
python setup.py install
这样做时,会发现执行install命令时,它首先还是会执行build命令,因为已经执行过该命令,build目录中已经是最新的了,所以它直接跳过。
一般情况下,如果只是安装从网上下载下来的包,则不需要分成两个步骤。不过这对于执行一些高级任务来说是有用的。
1:构建过程
build命令,主要是将需要安装的文件放到发布根目录下的build子目录中,如果需要改变build目录的位置,可以使用build-base选项,比如:
python setup.py build --build-base=/path/to/pybuild/foo-1.0
默认情况下,build子目录的结构如下:
build/
lib/
或者是:
build/
lib.<plat>/
temp.<plat>/
上面的<plat>会扩展为当前的OS平台以及Python版本。如果该发布只包含纯Python模块,则只会生成lib目录,也就是上面的第一种情况。如果发布中包含由C/C++编写的扩展模块,则会是第二种情况,此时,temp.plat目录中存放了由编译器、连接器产生的临时文件,这些临时文件不会被安装。在两种情况中,lib目录或者lib.plat目录中的文件都会被安装。
2:安装过程
在执行完build命令后(要么明确的运行,要么是在install中执行),install命令剩下的工作就比较简单了,它只是把build/lib或者build/lib.plat中的任何文件都复制到指定的安装目录中。
如果没有指定安装目录,(比如仅执行setup.py install),则install命令就会把文件安装到第三方Python模块的标准路径中。标准路径根据平台的不同而不同。在Unix(以及Mac OS X)上,这还取决于要安装的模块是否包含扩展模块:
Platform |
Standard installation location |
Default value |
Unix (pure) |
prefix/lib/pythonX.Y/site-packages |
/usr/local/lib/pythonX.Y/site-packages |
Unix (non-pure) |
exec-prefix/lib/pythonX.Y/site-packages |
/usr/local/lib/pythonX.Y/site-packages |
Windows |
prefix\Lib\site-packages |
C:\PythonXY\Lib\site-packages |