用 Eclipse 和 Ant 進(jìn)行 Python 開發(fā)
用 Eclipse IDE 和 Apache Ant 構(gòu)建工具進(jìn)行 Python 開發(fā)
|
|
級(jí)別: 初級(jí)
Ron Smith
, 負(fù)責(zé)人
2004 年 6 月 01 日
Python 是一種非常靈活強(qiáng)大的動(dòng)態(tài)腳本編程語言,具有完整的面向?qū)ο筇匦浴1姸嗟闹С终咧赋觯琍ython 語言與其他語言相比能更快更有效地表達(dá)出他們的意圖。但是從 Java 技術(shù)? 或 Microsoft? .NET 剛剛轉(zhuǎn)到 Python 的人會(huì)發(fā)現(xiàn),功能豐富而精致的 IDE 和開發(fā)工具都不見了。那些開發(fā)人員可以從他們熟悉的 Java 開發(fā)工具中找到解決方案。本文著重介紹了如何使用基于 Java 技術(shù)的流行開發(fā)工具 Eclipse 和 Ant 進(jìn)行 Python 開發(fā)。
簡介
多年以來, Java 語言和 Python 陣營之間一直存在大量的異花授粉現(xiàn)象。在這方面作出突出表率的可能是 Jython。這是一個(gè)純粹用 Java 實(shí)現(xiàn)的 Python 運(yùn)行時(shí)環(huán)境。按照這一說法,您將研究如何用 Eclipse IDE 和 Ant 構(gòu)建與部署工具實(shí)現(xiàn) Python 開發(fā)。Eclipse 和 Ant 是非常流行的工具,它們特性豐富、可擴(kuò)展性強(qiáng)、而且開放源代碼;Python 也具有相同的品質(zhì)。PyDev 和 PyAntTasks 分別是 Eclipse 和 Ant 的擴(kuò)展,有了它們就可能用這些 Java 工具開發(fā) Python。本文從下載安裝所需的工具與擴(kuò)展開始講起。為了解釋如何在 Python 開發(fā)中使用 Eclipse 和 Ant,我將用實(shí)際的 Python 代碼例子讀取 RSS 資源。
本文不會(huì)涉及 Eclipse、Ant、Python 的細(xì)節(jié)。有關(guān)這些話題的深入討論,請(qǐng)參閱 參考資料 一節(jié)中的鏈接。
Python 支持情況
本文用到的軟件都在 CPython 2.3 下測(cè)試過。除了幾個(gè)異常情況之外,應(yīng)該也能在 Jython 中運(yùn)行。特別需要指出,PyDev 調(diào)試器目前不支持 Jython。另一個(gè)區(qū)別是通過 Jython 執(zhí)行的腳本在從 PyDev 中運(yùn)行之后就轉(zhuǎn)入交互模式,這樣就必須手動(dòng)殺死。PyDev 編輯器與 Jython 的源代碼兼容,Python Ant 任務(wù)除 py-doc 任務(wù)之外也和 Jython 兼容。
使用 Eclipse 進(jìn)行 Python 開發(fā)
Eclipse 概述
Eclipse 是一個(gè) Java 技術(shù)集成開發(fā)環(huán)境,由 IBM 開發(fā),并開放其源代碼。它是 IBM 商業(yè)軟件 WebSphere Application Development 環(huán)境以及其他多種工具的基礎(chǔ)。Eclipse 的開發(fā)社區(qū)非常活躍,他們不僅開發(fā) Eclipse 本身,還開發(fā)大量的插件供 Eclipse 使用。有關(guān) Eclispe 和 Eclipse 插件的 Web 站點(diǎn),請(qǐng)參閱 參考資料 一節(jié)中的鏈接。盡管從傳統(tǒng)上講 Eclipse 是一種 Java 開發(fā)工具,但是一些插件的存在使得在 Eclipse 中開發(fā)其他語言的程序成為可能,如 C/C++、Python 和 Perl。
在 Eclipse 中,源代碼被組織到項(xiàng)目(project)中。項(xiàng)目可以加載、卸載和導(dǎo)入。Eclipse 用戶界面的結(jié)構(gòu)劃分為視圖(View)與編輯器(Editor)。視圖與編輯器的例子包括:源代碼大綱視圖、Java 源代碼編輯器、Python 源代碼編輯器和文件系統(tǒng)導(dǎo)航視圖。Eclipse 用戶界面中最關(guān)鍵的隱含概念就是 視角(perspective)。視角是通常在執(zhí)行某種類型活動(dòng)時(shí)一起使用的一組視圖。Eclipse 中的標(biāo)準(zhǔn)視角包括:Debug、Java Browsing、Java、Java Type Hierarchy、Plug-in Development、CVS Repository Exploring、Resource 和 Install/Update。目前還不存在單獨(dú)的 Python 視角。在進(jìn)行 Python 開發(fā)時(shí),我通常使用 Resource 視角和 Debug 視角。
安裝 PyDev
首先,從 Eclipse Web 站點(diǎn)上下載 Eclipse(請(qǐng)參閱 參考資料 一節(jié)中的鏈接),并根據(jù)您的平臺(tái),按照下面的安裝指南安裝 Eclipse:
Eclipse 的更新機(jī)制使 PyDev 插件的安裝更加容易。從 Eclipse 中選擇 Help > Software Updates > Update Manager,啟動(dòng) Install/Update 視角。在左下角的 Feature Updates 視圖中,將 PyDev 插件更新站點(diǎn)作為新的 Site Bookmark 添加到“Sites to Visit”文件夾下。Eclipse 的 PyDev 更新站點(diǎn) URL 為 http://pydev.sf.net/updates/。現(xiàn)在,F(xiàn)eature Updates 編輯器中應(yīng)該顯示出“PyDev”這一特性。在 Feature Updates 編輯器中,展開 PyDev > Other,選擇其中顯示的 PyDev 特性(至少應(yīng)該是 0.4.1)。然后選擇 “Install Now”安裝該特性。Eclipse 將下載 PyDev 插件,并將其安裝到 Eclipse 中。
導(dǎo)入樣例項(xiàng)目
為訪問本項(xiàng)目中使用的樣例代碼,可先下載 zip 文件(請(qǐng)參閱 參考資料一節(jié)),在文件系統(tǒng)中展開該 zip 文件,然后將其中的項(xiàng)目導(dǎo)入 Eclipse。導(dǎo)入項(xiàng)目的方法是先切換到 Resource 視角,選擇 File > Import,再選擇“Existing Project into Workspace”,然后選擇您展開 zip 文件的位置。這時(shí),Navigator 視圖中應(yīng)該出現(xiàn) feedParserTest 項(xiàng)目。
樣例項(xiàng)目中已經(jīng)包含了 Fead Parser 通用資源解析庫,該庫按 Python 開放源代碼許可協(xié)議發(fā)布。有關(guān) Feed Parser 項(xiàng)目 Web 網(wǎng)站的鏈接,請(qǐng)參閱 參考資料 一節(jié)。
PyDev 漫游
現(xiàn)在開始學(xué)習(xí)如何通過已導(dǎo)入的項(xiàng)目了解 PyDev 的特性。PyDev 正處于開發(fā)過程中,但已經(jīng)是非常高效的 Python 開發(fā)環(huán)境。現(xiàn)在的 PyDev 主要包括以下特性:
- 包含 Python 語法高亮顯示特性的 Python 編輯器。
- 進(jìn)行 Python 語法分析,并在 Python 編輯器和 Tasks 視圖中高亮顯示錯(cuò)誤。
- 可將制表符轉(zhuǎn)換成空格的選項(xiàng)。
- Outline 視圖顯示導(dǎo)入的庫、類以及函數(shù)。
- 終端視圖中的 Python 堆棧跟蹤信息可超鏈接到源代碼中。
- 源代碼內(nèi)部的超鏈接;同一模塊內(nèi)的導(dǎo)入和函數(shù)調(diào)用可通過超鏈接進(jìn)行導(dǎo)航。
- 從 Navigator 視圖中運(yùn)行 Python 腳本的能力。
- 調(diào)試器支持?jǐn)帱c(diǎn)、代碼單步執(zhí)行以及顯示變量的值。
PyDev 選項(xiàng)窗口
通過 Window > Preferences,并選擇 PyDev(請(qǐng)參閱圖 1),便可訪問 PyDev 選項(xiàng)。第一組選項(xiàng)可以改變 PyDev 在源代碼中處理制表符的方式,還可以改變語法元素的顏色。
圖 1. PyDev 選項(xiàng)窗口
設(shè)置 Python 解釋器
PyDev Debug 選項(xiàng)可以選擇 Python 解釋器,供執(zhí)行 Python 代碼時(shí)使用。如果 PyDev 無法找到 Python 解釋器,或者想使用別的解釋器,可在此設(shè)置(請(qǐng)參閱圖 2)。
圖 2. PyDev Debug 選項(xiàng)
處理源代碼
我的大部分 Python 工作都是在 Resource 視角中完成的。使用方法是先切換到 Resource 視角,然后在左上角的 Navigator 視圖中雙擊 feedParserTest/src/feedparserTest/FeedparserTest.py 文件。Python 編輯器打開該文件,對(duì) Python 語法進(jìn)行解析,完成設(shè)置顏色和語法檢查的工作(請(qǐng)參閱圖 3)。
圖 3. Python 編輯器
如果源代碼中有任何錯(cuò)誤,則顯示在右下角的 Tasks 視圖中顯示出來。雙擊 Tasks 視圖中的錯(cuò)誤,便可找到那條討厭的代碼行。
Outline 視圖在左下角,其中用一種便于瀏覽的結(jié)構(gòu)顯示出當(dāng)前正在編輯的文件。導(dǎo)入的庫、類、函數(shù)全都顯示出來,通過雙擊 Outline 視圖中的項(xiàng)目,便可以實(shí)現(xiàn)導(dǎo)航。PyDev 在編輯 Python 文件的過程中對(duì)齊進(jìn)行預(yù)先解析的工作,同時(shí)更新 Outline 視圖,執(zhí)行語法檢查,并用不同顏色顯示語法元素。
編輯器的特性
PyDev 0.4 版在 Python 源代碼編輯器中為函數(shù)和導(dǎo)入庫加入了超鏈接的特性。如果在越過某項(xiàng)導(dǎo)入或函數(shù)調(diào)用(必須在 PYTHONPATH
目錄中)的同時(shí)按下 Control 鍵,PyDev 就能顯示出一個(gè)超鏈接,這樣您可以在導(dǎo)入庫或函數(shù)的源代碼之間導(dǎo)航。請(qǐng)注意,為了在您自己的源代碼中跨模塊使用該特性(從一個(gè)模塊鏈接到另一個(gè)模塊),必須修改 PYTHONPATH
環(huán)境變量,在其中加入這些模塊,這樣 PyDev 就可以找到它們了。
人們已經(jīng)開始將一些優(yōu)異的源代碼編輯特性加入最新版本的 PyDev 中,其中就包括代碼塊注釋與取消注釋,以及代碼左右移位(請(qǐng)參閱圖 4)。
圖 4. PyDev 編輯器的其他特性
運(yùn)行 Python 腳本
如果不能執(zhí)行代碼,那么 IDE 也不是太有用。為執(zhí)行 Python 代碼,可從 Navigator 視圖中選擇 feedparser.py 文件,用右鍵點(diǎn)擊,然后選擇 Python > Run。隨后會(huì)顯示 Python 的啟動(dòng)配置窗口(請(qǐng)參閱圖 5)。
圖 5. Python 啟動(dòng)配置
Python 啟動(dòng)配置窗口中可以定義腳本執(zhí)行的當(dāng)前目錄,傳遞給腳本的參數(shù),以及用哪一個(gè) Python 解釋器運(yùn)行腳本。feedparser.py 以一個(gè) RSS URL 作為參數(shù),所以可在參數(shù)字段中填入 URL,如 http://www.ibm.com/developerworks/news/dw_dwtp.rss。其余的缺省定義就可以了,所以單擊 Run。
腳本執(zhí)行時(shí)輸出信息顯示在 Console 窗口中。如果有錯(cuò)誤出現(xiàn),Console 窗口中將顯示堆棧跟蹤信息,其中的每一行都可以通過超鏈接找到 Python 源代碼。
Python 調(diào)試器
Python 調(diào)試器是最近才加入 PyDev 插件中的。要使用調(diào)試器,可在 Python 編輯器中想中斷的代碼行的左側(cè)點(diǎn)擊,設(shè)置斷點(diǎn)。在圖 6 中,我在 feedparser.py 的 1830 行處設(shè)置了斷點(diǎn)。然后在 Navigator 視圖中選擇這個(gè) Python 模塊,點(diǎn)擊右鍵,選擇“Python > Debug...”。這時(shí)將顯示與前面相似的一個(gè)啟動(dòng)配置窗口。點(diǎn)擊 Debug 進(jìn)入 Debug 視角,同時(shí)啟動(dòng)調(diào)試器。
圖 6. Python 調(diào)試器
左上角的 Debug 視圖顯示當(dāng)前正在執(zhí)行的進(jìn)程和線程,右上角的 Variables 視圖顯示當(dāng)前運(yùn)行域中的所有變量,Python 編輯器會(huì)顯示調(diào)試器目前停在哪條語句上,同時(shí)所有的輸出信息都顯示與 Console 視圖中。調(diào)試器可以通過 Debug 視圖底部的按鈕或 Run 菜單進(jìn)行控制。
其他 Eclipse 特性
Eclipse 及其插件還具備很多其他的特性,可應(yīng)用于 Python 開發(fā)中,如 XML 編輯器、UML 編輯器(不過大多數(shù)是以 Java 代碼為中心),還有資源控制方面的插件。目前 Eclipse 插件站點(diǎn)上列出的插件幾乎有 500 個(gè)(請(qǐng)參閱 參考資料 一節(jié)中的相關(guān)鏈接)。我將著重介紹一個(gè)對(duì)很多 Python 開發(fā)人員都特別有用的插件:Eclipse 發(fā)行版中已經(jīng)包括的 CVS 插件,不過不會(huì)討論細(xì)節(jié)內(nèi)容。
Eclipse 中包括特性豐富的集成 CVS:
- 支持 SSH、pserver、ext 等連接方法。
- 基本 CVS 命令的支持:檢出項(xiàng)目、提交變更、更新、向.cvsignore 中增加文件或模式等等。
- 文件合并查看。
- 在源代碼控制中實(shí)現(xiàn)對(duì)文件不同之處的比較。
- 項(xiàng)目同步,并用資料庫顯示出刪除和新增的內(nèi)容。
還可以通過提供其他插件來支持其他源代碼控制系統(tǒng),如 ClearCase、Subversion、Visual SourceSafe 等。
在 Eclipse 中使用 Python 的交互式 shell
Python 解釋器支持 Python 代碼的交互式執(zhí)行。這種方式對(duì)于調(diào)試一段代碼是非常有用的,因?yàn)椴挥冒汛a放進(jìn) Python 腳本中并執(zhí)行腳本了。同時(shí),Python 解釋器的交互模式可以很容易地集成到 Eclipse 中。
要增加對(duì) Python 交互式執(zhí)行的支持,可通過 Run > External Tools > External Tools 增加一個(gè) External Tool 啟動(dòng)程序。這時(shí)將打開 External Tool 啟動(dòng)程序配置窗口。在 Configurations 列表中選擇“Program”,然后點(diǎn)擊“New”創(chuàng)建一個(gè)新的配置。將該配置命名為諸如 "pythonInteractive" 之類,然后設(shè)置 Location,令其指向您的 Python 解釋器,接著,將 "-i" 作為唯一的參數(shù)傳遞進(jìn)來(請(qǐng)參閱圖 7)。
在 Common 選項(xiàng)卡下,選中復(fù)選框,使該配置在 External Tools 收藏夾菜單中顯示出來。
圖 7. Python 交互方式配置
要運(yùn)行剛剛在 Eclipse 中創(chuàng)建的啟動(dòng)器,可選擇 Run > External Tools > pythonInterpreter。Python 解釋器的輸出顯示在 Console 視圖中。Console 中可輸入 Python 命令并執(zhí)行,就像從命令行中執(zhí)行 Python 一樣。為導(dǎo)入并在交互模式下使用模塊,您需要將模塊的位置增加到 PYTHONPATH
環(huán)境變量中。
在 Eclipse Console 中執(zhí)行 Python 與用命令行執(zhí)行的不同之處在于,無法啟用命令歷史特性(通過向上和向下的方向鍵實(shí)現(xiàn)),因?yàn)?Eclipse Console 會(huì)自己解釋這些鍵。
在 Python 開發(fā)中使用 Ant
Python 會(huì)在它需要的時(shí)候自動(dòng)編譯模塊。這意味著 Python 開發(fā)人員通常不必顯式地對(duì)模塊進(jìn)行編輯。即便如此,有時(shí)候手工編譯 Python 代碼還是很有用的,同時(shí),構(gòu)建和部署過程中還有很多其他方面的內(nèi)容可以自動(dòng)化實(shí)現(xiàn)。這也正是構(gòu)建工具的用武之地。
我將著重介紹來自 Java 編程世界中的 Apache Ant,這個(gè)工具可大量應(yīng)用在 Python 開發(fā)中。Apache Ant 是 Java 編程領(lǐng)域內(nèi)事實(shí)上的標(biāo)準(zhǔn)構(gòu)建工具。它更加輕便,與 Java 技術(shù)結(jié)合得更好,可用于替代其他的構(gòu)建工具。Ant 可以在支持 Java 編程語言的任何一種平臺(tái)上運(yùn)行。盡管我們需要的大多數(shù)構(gòu)建特性 Ant 都已經(jīng)提供了,但如果要將 Ant 用做 Python 構(gòu)建工具,還是需要有一些關(guān)鍵的與 Python 相關(guān)的特性。我已經(jīng)開發(fā)了若干定制的 Ant 插件(用 Ant 的行話講叫做 task),可提供構(gòu)建 Python 時(shí)需要的特定于 Python 的特性。
Ant 用 XML 作為描述構(gòu)建的格式。build 文件組織為需要執(zhí)行的目標(biāo)。每一個(gè)目標(biāo)都可能依賴于其他的目標(biāo)。Ant 將根據(jù)您所請(qǐng)求執(zhí)行的目標(biāo),以及一組依賴目標(biāo),來執(zhí)行任何需要的目標(biāo)。每一個(gè)目標(biāo)都可能包含任意數(shù)量的 Ant 任務(wù),而由 Ant 任務(wù)實(shí)際執(zhí)行目標(biāo)的工作。Ant 有很多內(nèi)置的任務(wù),可以完成諸如編譯 Java 代碼、生成文檔、操縱文件和目錄,同時(shí)第三方又提供了很多附加的任務(wù)。
安裝 Python Ant 庫
我將通過為 feedparser 項(xiàng)目創(chuàng)建構(gòu)建腳本來介紹 Ant 構(gòu)建腳本和 Python Ant 任務(wù)的基礎(chǔ)知識(shí)。為了使用 Python Ant 任務(wù),您需要下載并安裝包含這些任務(wù)的 Java 庫。首先,從 參考資料 一節(jié)中列出的 URL 中下載 Python Ant 任務(wù)庫(pyAntTasks.jar)。然后,將 JAR 文件拷貝到 Eclipse 的 Ant 插件下的 lib 目錄中。這應(yīng)該是 Eclipse 安裝目錄下形如 plugins/org.apache.ant_1.5.3 的子目錄。
Python Ant 任務(wù)庫拷貝完畢之后,必須在 Eclipse 中啟用庫。選擇 Window > Preferences,然后選擇 Ant > Runtime。將 Ant Home Entries 展開,其中可看到 Eclipse 使用的庫(JAR 文件)列表。選擇“ Add JAR”,然后從 Eclipse Ant 插件的 lib 目錄中選擇 Python Ant JAR 文件,就可以將剛剛拷貝的 Python Ant JAR 文件加入庫列表中(請(qǐng)參閱圖 8)。
圖 8. 向 classpath 中加入 Python Ant 任務(wù)
您現(xiàn)在應(yīng)該能夠創(chuàng)建和運(yùn)行包含 Python 任務(wù)的 Ant 構(gòu)建腳本了。下面進(jìn)入構(gòu)建腳本內(nèi)部!
創(chuàng)建構(gòu)建腳本
我將逐步介紹如何創(chuàng)建一個(gè)簡單的 Python 構(gòu)建腳本(請(qǐng)參閱清單 1)。完整的構(gòu)建腳本 build.xml 可從 feedParserTest 項(xiàng)目的頂層目錄中找到。
清單 1. 用于編譯 Python 源代碼的構(gòu)建腳本片斷
<project name="feedParserTest" default="compile">
<taskdef resource="pyAntTasks.properties"/>
<property name="src.dir" value="src"/>
<target name="compile">
<py-compile dir="${src.dir}" pythonpath="${src.dir}" optimize="0"/>
</target>
</project>
|
先介紹一個(gè)只編譯 Python 樣例代碼的構(gòu)建腳本。<project> 標(biāo)簽總是構(gòu)建腳本的根標(biāo)簽。<taskdef> 標(biāo)簽聲明在整個(gè)構(gòu)建腳本中使用的 Python 任務(wù)。在構(gòu)建腳本的底部,可以定義 compile
目標(biāo)。目標(biāo)元素內(nèi)部是 compile
運(yùn)行期間執(zhí)行的任務(wù)。特別的是 py-compile 任務(wù),它負(fù)責(zé)從 src 目錄開始,編譯所有的 Python 代碼。該任務(wù)會(huì)遞歸遍歷所有的子目錄,并編譯所有的 Python 模塊。腳本中沒有采用將 src 目錄硬編碼到調(diào)用之處的方式,而是在構(gòu)建腳本中定義了稱為 src.dir 的屬性。然后,在需要使用這個(gè)目錄名的時(shí)候,就可以通過 ${src.dir}
來引用。
要運(yùn)行構(gòu)建腳本,可從 Eclipse 中打開它。Eclipse 具有內(nèi)置的 Ant 構(gòu)建腳本編輯和瀏覽功能。Outline 視圖可以顯示出構(gòu)建腳本的結(jié)構(gòu)。在 Navigator 視圖中,選擇該構(gòu)建腳本,用右鍵點(diǎn)擊,然后選擇“Run Ant...”。選擇 compile
目標(biāo),然后點(diǎn)擊“Run”。構(gòu)建腳本執(zhí)行過程中的輸出信息應(yīng)該顯示在 Console 視圖中,表示運(yùn)行成功。
Python 腳本執(zhí)行任務(wù)
接下來將向構(gòu)建腳本中加入新的目標(biāo),用于執(zhí)行 Python 腳本(請(qǐng)參閱清單 2)。在本例中,可以將 RSS URL 作為參數(shù)來執(zhí)行 feedparser.py 腳本。
清單 2. 運(yùn)行 feedparser 腳本的構(gòu)建腳本片斷
<target name="run.feedparser" depends="compile">
<py-run script="src/feedparser/feedparser.py" pythonpath="${src.dir}" optimize="0">
<arg value="http://www.ibm.com/developerworks/news/dw_dwtp.rss">
</py-run>
</target>
|
上面的目標(biāo)以 RSS URL 為唯一的參數(shù)來執(zhí)行 feedparser.py 腳本。該目標(biāo)聲明為依賴于 compile
目標(biāo),所以后者將首先執(zhí)行。實(shí)際上這一步并不是很必要,因?yàn)?Python 會(huì)根據(jù)需要自動(dòng)編譯源代碼。如果您執(zhí)行 run.feedparser
目標(biāo),就會(huì)運(yùn)行 feedparser.py 腳本,同時(shí)將 RSS 的內(nèi)容輸出到 Console 中。
Python 文檔任務(wù)
Python 的 API 文檔編制機(jī)制與 Java 技術(shù)中的 JavaDoc 系統(tǒng)類似,稱為 PyDoc。在構(gòu)建腳本中加入清單 3 中列出的如下 XML 片斷,可為所有的 Python 模塊生成 PyDoc。
清單 3. 用于生成 PyDoc 的構(gòu)建腳本片斷
1: <property name="pydoc.dir" value="pydoc"/>
2:
3: <target name="init">
4: <mkdir dir="${pydoc.dir}"/>
5: </target>
6:
7: <target name="pydoc" depends="init,compile">
8: <py-doc pythonpath="${src.dir}" destdir="${pydoc.dir}">
9: <fileset dir="${src.dir}">
10: <include name="**/*"/>
11: </fileset>
12: </py-doc>
13: </target>
|
從對(duì)上述 pydoc 目標(biāo)的解析可看出,第 7 行聲明了目標(biāo)名稱,并指出它依賴于 init
和 compile
目標(biāo)。這意味著在運(yùn)行 pydoc 目標(biāo)之前,Ant 必須保證 init
和 compile
目標(biāo)已經(jīng)運(yùn)行,如果沒有,則首先運(yùn)行這兩個(gè)目標(biāo)。
pydoc
目標(biāo)所依賴的 init
目標(biāo)在第 3 至第 5 行定義。 init
目標(biāo)僅僅創(chuàng)建了一個(gè)存放 PyDoc API 文檔文件的目錄。如前所述,要為所生成文檔的保存位置定義一個(gè)屬性,名為 pydoc.dir。
第 8 行開始是 py-doc 任務(wù)。如前所述,您傳入生成 pydoc 過程中所使用的 PYTHONPATH
。 destdir
屬性告訴 py-doc 任務(wù)將生成的 HTML 文檔輸出到何處。
第 9 至第 11 行定義了在生成文檔的過程中應(yīng)該處理哪些 Python 源文件。文件集是 Ant 腳本中通用的結(jié)構(gòu),可用于定義所操作的一組文件。這是一種很強(qiáng)大的特性,它使您能夠通過名字模式、布爾邏輯和文件屬性來選擇所要操作的文件。Ant 文檔中有這方面的完整描述。本例中遞歸選擇了“src”目錄下的所有文件。
Python 單元測(cè)試任務(wù)
Python 中具有標(biāo)準(zhǔn)的單元測(cè)試框架(從 Python 2.3 開始。在 Python 2.2 中這只是可選模塊),與 Java jUnit 框架十分類似。測(cè)試用例的結(jié)構(gòu)與 jUnit 采用相同的方式。每一個(gè)待測(cè)試的類和模塊通常都具有自己的測(cè)試類。測(cè)試類中包含測(cè)試裝置(fixture),它們?cè)?setUp
函數(shù)中初始化。每一個(gè)測(cè)試都編寫為測(cè)試類中的一個(gè)獨(dú)立的測(cè)試函數(shù)。unittest 框架會(huì)在測(cè)試函數(shù)之間循環(huán)往復(fù),先調(diào)用 setUp
、再測(cè)試函數(shù)、然后清除( tearDown
)測(cè)試函數(shù)。請(qǐng)參閱清單 4 中的樣例。
清單 4. Python 單元測(cè)試模塊
import unittest
from pprint import pprint
import feedparser
class FeedparserTest(unittest.TestCase):
"""
A test class for the feedparser module.
"""
def setUp(self):
"""
set up data used in the tests.
setUp is called before each test function execution.
"""
self.developerWorksUrl = "testData/developerworks.rss"
def testParse09Rss(self):
"""
Test a successful run of the parse function for a
0.91 RSS feed.
"""
print "FeedparserTest.testParse09RSS()"
result = feedparser.parse(self.developerWorksUrl)
pprint(result)
self.assertEqual(0, result['bozo'])
self.assert_(result is not None)
channel = result['channel']
self.assert_(channel is not None)
chanDesc = channel['description']
self.assertEqual(u'The latest content from IBM developerWorks',
chanDesc)
items = result['items']
self.assert_(items is not None)
self.assert_(len(items)> 3)
firstItem = items[0]
title = firstItem['title']
self.assertEqual(u'Build installation packages with
solution installation and deployment technologies',
title)
def tearDown(self):
"""
tear down any data used in tests
tearDown is called after each test function execution.
"""
pass
if __name__ == '__main__':
unittest.main()
|
上述清單是實(shí)現(xiàn) feedparser 模塊基本測(cè)試功能的測(cè)試類。完整的測(cè)試類見 feedParserTest 項(xiàng)目下的 src/feedparserTest/FeedparserTest.py。 setUp
函數(shù)負(fù)責(zé)準(zhǔn)備整個(gè)測(cè)試過程中需要使用的測(cè)試裝置,在本例中只有測(cè)試用的 RSS 文件的目錄,測(cè)試函數(shù)將對(duì)其進(jìn)行解析。 testParse09Rss
是真正的測(cè)試函數(shù)。這個(gè)函數(shù)調(diào)用 feedparser.parse 函數(shù),傳遞測(cè)試用的 RSS 文件,輸出解析結(jié)果,并通過 TestCase 類的 assert 函數(shù)執(zhí)行基本的檢查統(tǒng)作。如果任何 assert 的求值結(jié)果不是真,或是在執(zhí)行過程中拋出任何異常,unittest 就會(huì)報(bào)告一次測(cè)試失敗或錯(cuò)誤。最后的兩行負(fù)責(zé)在這個(gè)測(cè)試類內(nèi)部運(yùn)行測(cè)試,方法是直接運(yùn)行該模塊即可。
要獨(dú)立運(yùn)行該測(cè)試類,可以按前面所說的相同方式運(yùn)行 FeedparserTest.py 模塊。在 Eclipse Navigator 視圖中選擇 FeedparserTest.py,然后通過 Python > Run 運(yùn)行。此時(shí)顯示啟動(dòng)配置窗口。除 Base 目錄之外,其他都保持缺省值即可。Base 目錄必須是 feedParserTest 項(xiàng)目的目錄,這樣才能在當(dāng)前目錄下找到 RSS 文件(testData/developerworks.rss)。修改 base 目錄的設(shè)置,然后點(diǎn)擊“Run”。輸出信息顯示在 Console 上。
您也許希望我們編寫的所有單元測(cè)試都能夠作為構(gòu)建的一部分自動(dòng)執(zhí)行。將下面清單 5 所示的構(gòu)建片斷加入構(gòu)建腳本便可實(shí)現(xiàn)。
清單 5. 執(zhí)行單元測(cè)試的構(gòu)建腳本片斷
1: <target name="tests" depends="compile">
2: <py-test pythonpath="${src.dir}" dir=".">
3: <fileset dir="${src.dir}">
4: <include name="**/*Test.py"/>
5: </fileset>
6: </py-test>
7: </target>
|
第一行是目標(biāo)聲明,這與其他的腳本相同。第 2 至第 6 行調(diào)用 py-test 任務(wù)。這部分代碼將在“src”目錄下查找所有以“Test.py”結(jié)尾的所有文件,并運(yùn)行所有測(cè)試。 PYTHONPATH
設(shè)置為“src”,測(cè)試執(zhí)行的當(dāng)前工作目錄就是當(dāng)前目錄(‘.’)。
運(yùn)行目標(biāo)的方法是先運(yùn)行構(gòu)建腳本,再選擇執(zhí)行“tests”目標(biāo)。該目標(biāo)將運(yùn)行所有以“Test.py”結(jié)尾的測(cè)試用例,本例中僅有 FeadparserTest.py。
結(jié)束語
Eclipse 和 PyDev 插件的結(jié)合,以及 Apache Ant 與 Python Ant 任務(wù)一起使用,可以為 Python 開發(fā)提供完全集成的開發(fā)環(huán)境和構(gòu)建/部署工具。這些工具尚在開發(fā)過程中,因此要經(jīng)常查看是否有更新,如果您覺得特別希望看到某種特性,可以卷起袖管自力更生。
參考資料
|
|
關(guān)于作者
|
|
|
Ron Smith 是 RPS Technologies, Inc 的創(chuàng)始人。這是一家軟件開發(fā)與軟件顧問公司,總部位于芝加哥地區(qū)。Ron Smith 為客戶提供基于 J2EE 的企業(yè)應(yīng)用程序發(fā)方面的咨詢,同時(shí)也在 RPS Technologies 內(nèi)部開發(fā)軟件產(chǎn)品。可以通過 ron.smith@rpstechnologies.net與 Ron 聯(lián)系。
|