轉載請注明出處:http://mageedu.blog.51cto.com,謝謝!
一、基本安裝
Python Distribution Utilities(Distutils)在Python 2.0時引入,其極大地友善了對第三方子產品的管理。通常,子產品作者提供的子產品可能會以不同的形式出現,這其中,最易于安裝的莫過于作業系統上對應的安裝包,如Windows上的exe或msi,以及基于RPM的Linux發行版(如Redhat/CentOS/SuSE等)上的rpm格式的包。然而,子產品的最常見形式應該是源碼包,如果其是使用Distutils遵循标準格式進行的封包,安裝起來也很簡單。在類Unix作業系統上,使用“python setup.py install”即可安裝,在Windows系統上,隻需要在“cmd”中執行“setup.py install”指令即可。
“setup.py install”的執行過程包含兩個階段:build和install。事實上,出于定制等目的,此兩個階段可以分别進行:首先執行“python setup.py build”進行編譯,而後再執行“python setup.py install”進行安裝。不過,此時的install階段仍然會顯示執行build的過程,雖然其并未執行任何多餘的操作。
“python setup.py build”編譯過程直接在源碼目錄下進行,如果想保持源碼的整潔,也可以通過“python setup.py build --build-base=/path/to/pybuild”指令将編譯的結果儲存至額外指定的路徑下。編譯完成後,在目标路徑下會用一個名為“lib”或“lib.<platform>”的目錄來儲存即将安裝的子產品檔案,其中“lib”用于完全用python語言開發的子產品,而“lib.<platform>”通常用于基于C/C++開發的子產品。
“python setup.py install”實作的安裝過程非常簡單,其僅是将編譯好的檔案複制到指定的子產品安裝目錄中。在未指定安裝目錄時,子產品的安裝目錄為預設,其名稱通常為“site-packages”,其具體位置可以在python環境中進行檢視,例如在Windows系統上檢視的如下所示的結果中的“C:\\Python27\\lib\\site-packages”。
>>> import sys
>>> sys.path
['', 'C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages']
CentOS 6.5 x86_64系統自帶的python環境顯示結果則要複雜一些,如下所示。
['', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', '/usr/lib64/python2.6/lib-tk', '/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/python2.6/site-packages', '/usr/lib64/python2.6/site-packages/gtk-2.0', '/usr/lib/python2.6/site-packages', '/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info']
二、自定義安裝
2.1 自定義子產品的安裝基準目錄
實踐中,将第三方子產品安裝在非預設目錄下也是比較常見的需求,而Distutils的install指令為此也專門提供了相應的處理機制。
對于無法在全局site-packages目錄寫入檔案的普通使用者來說,可以為install指令指定“--user”選項将子產品安裝至使用者家目錄中相應的位置(類Unix系統通常為USER_BASE/lib/pythonX.Y/site-packages)。
如果出于僅以自用的目的想把子產品安裝至某特定路徑下,可以為install指令指定“--home=<dir>”選項。不過,如果想讓python使用此子產品,需要為python解釋器指定搜尋路徑,或通過編譯sitecustomize來調用site.addsitedir(),也可以通過編輯sys.path的值來實作。
此外,常見于一些Linux發行版中,python會安裝在/usr路徑下,如果需要将第三方子產品在安裝于/usr/local而非預設的/usr路徑下,則需要使用“--prefix”或“--exec-prefix”選項。其中,“--prefix”用于指定安裝目錄,而“--exec-prefix”用于指定平台特有的檔案(例如C庫)的安裝目錄,省略“--exec-prefix”時,其預設為“--prefix”指定的位置。檢視目前系統python的預設prefix,可以通過如下方式進行。
>>> sys.prefix
'/usr'
2.2 安裝路徑的深度定制
在安裝第三方子產品時,其會自動在安裝基準目錄中使用不同的目錄來分别存儲如python子產品、擴充子產品、可執行檔案、資料及C頭檔案等幾種不同類别的檔案。如果需要對此些子目錄進行定制,可以使用相應的選項進行:
python子產品:--install-purelib=/path/to/somewhere
擴充子產品: --install-platlib=/path/to/somewhere
所有子產品(即不區分python子產品或擴充子產品): --install-lib=/path/to/somewhere
可執行檔案: --install-scripts=/path/to/somewhere
資料檔案: --install-data=/path/to/somewhere
C頭檔案: --install-headers=/path/to/somewhere
這些路徑可以使用相對路徑或絕對路徑。不過,使用--install-lib會覆寫--instal-purelib或--install-platlib指定的位置。例如下面的安裝指令。
python setup.py install --home=~ \
--install-purelib=python/lib \
--install-platlib=python/lib.$PLAT \
--install-scripts=python/scripts
--install-data=python/data
如果需要為每一個安裝的第三方子產品都指定為特定的安裝方案,也可以通過編輯Distutils的配置檔案中[install]段的參數來統一定義,例如:
[install]
install-base=$HOME/python
install-purelib=lib
install-platlib=lib.$PLAT
install-scripts=scripts
install-data=data