Python中setuptools的簡介

鴨脖發表於2012-04-27

經常接觸Python的同學可能會注意到,當需要安裝第三方python包時,可能會用到easy_install命令。easy_install是由PEAK(Python Enterprise Application Kit)開發的setuptools包裡帶的一個命令,所以使用easy_install實際上是在呼叫setuptools來完成安裝模組的工作。

Perl 使用者比較熟悉 CPAN,而 Ruby 使用者則比較熟悉 Gems;引導 setuptools 的 ez_setup 工具和隨之而生的擴充套件後的easy_install 與 “Cheeseshop”(Python Package Index,也稱為 “PyPI”)一起工作來實現相同的功能。它可以很方便的讓您自動下載,編譯,安裝和管理Python包。

其實 Python 本身也自帶了一套工具 distutils ,用於釋出 Python 應用程式。但 distutils 沒有提供定義其它依賴包的功能,setuptools 的真正優點並不在於實現distutils 所能實現的功能——儘管它的確增強了distutils的功能並簡化了setup.py 指令碼中的內容。setuptools 最大的優勢是它在包管理能力方面的增強。它可以使用一種更加透明的方法來查詢、下載並安裝依賴包;並可以在一個包的多個版本中自由進行切換,這些版本都安裝在同一個系統上;也可以宣告對某個包的特定版本的需求;還可以只使用一個簡單的命令就能更新到某個包的最新版本。給人印象最為深刻的是,即使有些包的開發人員可能還從未考慮過任何 setuptools 相容性問題,我們依然可以使用這些包。

 

1、特性

a. 在構建時使用 EasyInstall 工具自動查詢、下載、安裝、升級所依賴的軟體包,EasyInstall 支援通過 HTTP、 FTP、 Subversion 以及 SuroceForge 下載軟體包,並能自動掃描 PyPI 上的網頁以找到下載連結。(對於熟悉 Perl 的使用者, PyPI 是 Python 領域最接近的 CPAN 了。)

b. 建立 Python Eggs,一種單檔案的可匯入的釋出格式。

c. 在包中的目錄中可以包含資料檔案,允許程式碼訪問這些資料檔案。(Python 2.4 distutils 也支援這個特性,不過 setuptools 能為面向 Python 2.3 的包也提供這樣的特性,此外還支援訪問壓縮包中的資料。)

d. 自動包含程式設計師的原始碼樹中的所有包,而不需要在獨立的 setup.py 中逐個宣告。

e. 自動在原始碼釋出中包含所有相關的檔案,而無需建立 MANIFEST.in 檔案,也不必在原始碼樹改變後強制生成 MANIFEST。

f. 自動為程式設計師專案中的任意數量的“main”函式生成封裝指令碼或者 Windows (控制檯或者圖行使用者介面) .exe 檔案。(注:這並不是 py2exe 的替代方案;這裡生成的 .exe 需要基於已安裝的 Python,而 py2exe 則不需要。)

g. 透明的 Pyrex(Pyrex 允許程式設計師編寫混合 Python 和 C 資料型別的程式碼,並編譯為 Python 的 C 擴充套件。)支援,這樣程式設計師的 setup.py 得以列出 .pyx 檔案並且即使終端使用者沒有安裝 Pyrex 也能夠執行(當然這需要程式設計師在原始碼釋出包中包含 Pyrex 生成的 C 程式碼)。

h. 對建立命令列別名的支援,setuptools 可以幫助程式設計師為釋出包建立專案需要的、每個使用者或者全域性的快捷方式,這通常用於命令列或選項中。

i. 上傳發布包到 PyPI 的支援,setuptools 可以幫助程式設計師將原始碼包或者 eggs 釋出到 PyPI 上。

j. 可以以“開發模式”釋出程式設計師的專案,這樣它可以出現在 sys.path 中,而程式設計師依然可以直接編輯原始碼的工作副本。

k. 方便的為 distutils 擴充套件新功能或者 setup() 引數,並能夠釋出可供不同的專案重複使用的擴充套件包,而無需複製程式碼。

l. 建立具有自動發現擴充套件功能的可擴充套件的應用程式或框架,只要在專案的安裝指令碼中簡單的宣告“入口點(entry points)”即可。

 

2、安裝

a. 使用 ez_setup.py 安裝

這是 setuptools 自豪的一種安裝方式,只需要一個大約 8K 作為的指令碼ez_setup.py,就能自動為使用者安裝包括 setuptools 自身在內的許多 Python 包。

使用這種方式,使用者只需要下載 ez_setup.py 並執行,就可以自動下載和安裝適合使用者當前 Python 版本的適當的 setuptools egg 檔案(當然,使用者需要 Python 2.3.5 以上的版本,64 位作業系統的使用者則需要 Python 2.4 以上的版本)。此外,這段指令碼還會將可執行的 easy_install 指令碼安裝到使用者所有的作業系統 Python 可執行指令碼正常應該安裝的位置(例如,Windows 使用者會安裝到 Python 安裝目錄下的 Scripts 目錄中)。關於這種安裝方法的更詳細說明和注意事項,請參考其官方說明。簡單的安裝命令如下:

wget -q http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py

安裝完後,最好確保easy_install所在目錄已經被加到PATH環境變數裡: 
Windows: C:\Python25\Scripts 
Linux: /usr/local/bin

b. 使用完整的安裝包安裝

當然,使用者也可以使用 setuptools 在 Python Cheese Shop 上釋出的合適的完整的釋出版本來安裝。對於使用 Windows 的使用者,這也是挺方便的方法,。

許多 Linux 發行版的官方包管理倉庫都包含 setuptools 的某個版本。例如,如果你跟我一樣使用 Ubuntu ,那安裝 setuptools 只是簡單的進行如下操作:

# apt-get install python-setuptools

注:如果安裝過程中有問題可嘗試參考這篇文章《如何安裝setuptools》來解決。

3、使用方法

使用方法非常簡單,在命令列輸入“easy_install 引數”即可。

a、通過模組名稱來安裝。setuptools會自動搜尋PyPI 以查詢最新版本的模組。如果找到的話,她會自動下載、編譯和安裝:例如

easy_install SQLObject

說明,安裝過程可能需要許可權,如果是ubuntu的話,可以加上sudo

b、指定查詢頁面("download page")來使用名稱和版本資訊來安裝或升級一個模組:

easy_install -f http://pythonpaste.org/package_index.html SQLObject

c、從指定模組下載地址來下載模組原始碼並在下載成功之後編譯安裝

easy_install http://example.com/path/to/MyPackage-1.2.3.tgz

d、在本地已經存在的egg檔案基礎上來安裝模組

easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg

e、升級一個已經安裝的模組到最新版本,如果在PyPI中這個模組有最新版本。

easy_install --upgrade PyProtocols

f、從原始碼中安裝模組(原始碼已經下載並解壓到當前資料夾下)(New in 0.5a9)

easy_install .

g、模組解除安裝 easy_install -m package-name (比如easy_install -m pylab)

如果想刪除通過easy_install安裝的軟體包,比如說:MySQL-python,可以執行命令:

easy_install -m MySQL-python 

注:此操作會從easy-install.pth檔案裡把MySQL-python的相關資訊抹去,剩下的egg檔案,你可以手動刪除。

 

更多easyinstall的使用方法參考Easyinstall官方文件

注:通過easy_install安裝軟體,相關安裝資訊會儲存到easy-install.pth檔案裡,路徑類似如下形式:

Windows:C:\Python25\Lib\site-packages\easy-install.pth
Linux:/usr/local/lib/python25/site-packages/easy-install.pth

4、相關資源

a、setuptools模組下載地址:http://pypi.python.org/pypi/setuptools

b、setuptools線上文件:http://peak.telecommunity.com/DevCenter/setuptools

c、Easy install線上文件:http://peak.telecommunity.com/DevCenter/EasyInstall

d、可愛的 Python: 使用 setuptools 孵化 Python egghttp://www.ibm.com/developerworks/cn/linux/l-cppeak3.html

f、ez_setup.py指令碼:http://peak.telecommunity.com/dist/ez_setup.py

 

以上是python下setuptools的簡介 。

 

關於 egg 
egg 是一個包含所有包資料的檔案包。在理想情況中,egg 是一個使用 zip 壓縮的檔案,其中包括了所有需要的包檔案。但是在某些情況下,setuptools 會決定(或被開關告知)包不應該是 zip 壓縮的。在這些情況下,egg 只是一個簡單的未曾壓縮的子目錄,但是裡面的內容是相同的。使用單一的版本可以方便地進行轉換,並可以節省一點磁碟空間,但是 egg 目錄從功能和組織結構上來說都是相同的。一直使用 JAR 檔案的 Java? 技術的使用者會發現 egg 非常熟悉。


文章來源http://www.juziblog.com/?p=365001

相關文章