最近由於需要使用腳本做系統配置,因此想到用Jython。以下隨筆大部分是轉載,結合個人使用體驗。
關於本教程
本教程介紹哪些內容?
這個兩部分的教程將介紹 Jython 腳本語言,並提供開始開發基於 Jython 的應用程序所需的足夠知識。Jython 是 Python 的一種實現,已無縫集成到 Java 平台中。Python 主要在 UNIX 環境中使用,是一種強大的面向對象的腳本語言。
Jython 非常有用,因為它運行於 JVM 上,且具有成熟腳本語言所具有的高生產率。與 Python 程序不同,Jython 程序可以運行在任何支持 JVM 的環境中。現在這意味着可在大多數計算系統上使用,包括 Microsoft Windows、Mac OS、大多數 UNIX 變體(包括所有 Linux 系統)和所有的 IBM 系統。
本教程采用漸進步驟介紹 Jython。本文(即本教程的前半部分)將介紹使用 Jython 的概念和編程基礎知識,包括訪問選項和文件編譯、語法和數據類型、程序結構、過程語句和函數。 本教程的第 2 部分將開始對采用 Jython 的面向對象編程進行概念性介紹。之后,我們將進行更具體的討論,包括類語句、屬性和方法、抽象類和運算符重載。這個高級討論還包括調試、字符串處理、文件 I/O 和 Jython 中的 Java 支持。本教程結束時,將一步步演示如何用 Jython 構建一個可以工作的 GUI 應用程序。
在本教程的開始部分,示例代碼非常簡單,但在第 2 部分結束時,您將會完全掌握函數、類和程序。本教程還包括一組附錄,詳細介紹了 Jython 的內部工作原理。
我是否應該學習本教程?
本教程面向各個層次的軟件開發人員,從偶爾的涉足者到專業人員。但它特別適合那些希望利用腳本語言所具有的高生產率優勢的 Java 開發人員。那些希望輕松進入 Java 開發世界的 Visual Basic 和 C++/C# 程序員,也可以學習本教程。
總之,我們將討論 Jython 腳本編程的以下方面:
第 1 部分
下載和安裝
對 Jython 的概念性介紹
使用命令行與使用源文件
語法和數據類型
程序結構
過程語句
函數
第 2 部分
用 Jython 進行面向對象編程
調試
Java 支持
字符串處理
文件 IO
用 Jython 構建 GUI 應用程序
要從本討論中獲益,應該至少熟悉一門過程編程語言和計算機編程的基本概念,包括命令行處理。要完全利用 Jython 的特性,還應該熟悉面向對象編程的基本概念。如果具有 Java 平台的實際知識,也是很有幫助的(盡管本教程不要求具備這些知識),因為 Jython 運行在該平台上。
注意,本教程面向 Windows 系統。所有命令示例均采用 Windows 語法。在大多數情況下,類似命令在 UNIX 系統上執行相同的功能,盡管不會演示這些命令。
工具、代碼和安裝要求
要學完本教程,必須在開發系統上安裝 Jython 2.5.2(jython_installer-2.5.2.jar)或更高版本。開發系統可以是任何 ASCII 文本編輯器(如 Windows Notepad)和命令提示符的組合。本教程包括獲得並安裝 Jython 的詳細說明。
要使用 Jython,還必須在系統上安裝 Java 運行時環境(Java Runtime Environment,JRE)。建議采用能得到的最新的 JRE(編寫本文時為 1.6.0版)。如果打算從瀏覽器使用 Jython(即作為 applet),瀏覽器必須可以使用 JRE 1.1。請參閱參考資料下載 Java 開發工具包 (JDK) 的最新版本。
本教程中的所有代碼示例都已在 Windows 2000 的 Sun Java 1.6.0 JRE 上運行的 Jython 上進行了測試。無須在其他操作系統上更改任何類似配置,這些例子都能正常工作。
入門
安裝說明
本節將逐步介紹在開發系統上下載、安裝和驗證 Jython 的每個步驟。
下載 Jython
可以從 Jython 主頁下載 Jython 2.5.2。您會發現下載頁面上的下載說明非常容易。
正如前面所提到的,本教程基於當前穩定的 Jython 級別,即版本 2.5.2。可以從 Jython 主頁獲得更高級的開發級別。
安裝 Jython
安裝 Jython 很簡單:只須執行從 Jython 主頁下載的類文件(jython_installer-2.5.2.jar)即可。假設已安裝了 JRE 且已將類文件下載到當前目錄中(下面的例子中是 C:\),下列命令將安裝 Jython(注意,<java_home> 是安裝 JRE 的目錄):
C:\><java_home>\bin\java jython-21
請按照安裝應用程序的提示執行。建議選擇默認值,並選擇 D:\jython2.5.2 作為目標目錄。
要驗證是否安裝了 Jython,請輸入命令:
D:\>dir D:\Jython2.5.2 |
命令執行后的結果應與下面的清單類似:
|
最后的步驟是確保配置了 Jython。要運行 Jython,請輸入下列命令啟動 Jython:
D:\jython2.5.2>jython |
執行該命令后應該產生一個與下面類似的介紹:
Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06) |
最后退出 Jython。在 Jython 提示符下,輸入下列命令:
>>> import sys; sys.exit() |
或者,可以按 Ctrl+C 兩次。
我們的生活更便捷
在結束“入門”一節之前,還應了解一件事:不必通過將 Jython 命令路徑 (<d>:\jython2.5.2) 添加到 PATH 變量來指定該路徑,現在只需在該路徑(<d>:\jython2.5.2) 命令提示符下鍵入 jython 即可。
Jython 的基本概念和優點
什么是 Jython?
上文提到,Jython 是用 Java 語言編寫的 Python 實現,並與 Java 平台集成在一起。Python 是一種腳本語言,經常在基於 UNIX 的系統(包括 Linux)中使用。Python 由 Guido van Rossum 發明並在1991年被引入到開發人員社區中。Jython 當前支持級別 2.5 的 Python 語法。
什么是腳本語言?
與 Java 編程語言不同,Jython 是一種腳本語言。腳本語言通常具有如下特點:
1、很容易學習和編碼
2、意圖明確且簡練,但功能強大
3、具有最小的必需結構來創建一個運行的“程序”
4、支持交互式(一次一個命令)執行
5、不要求執行編譯步驟
6、支持反射式程序設計
7、支持函數式程序設計
8、支持源代碼(即 eval 函數)的動態執行
9、運行外部程序
一般而言,可以說腳本語言對程序員效率的貢獻是建立在機器效率和性能之上的。與編程語言(如 Java 語言)相比,Jython 易於學習且編碼效率很高。
Jython 還可以被描述為輕巧靈活的語言。這種語言通常被認為是能執行各種各樣的任務,在解決許多不同類型的問題時很有用,易於使用且功能強大、意圖明確。它們也是理想的快速原型開發語言。
Jython 的優點
與基於 C 的兄弟 Python 一樣,Jython 大多數是在小場合中用來開發小型程序和腳本;它有許多特性,允許在幾分鍾內創建簡單而實用的程序。但這並不意味着 Jython 不能用於大規模的程序設計。實際上,Jython 支持復雜的打包方案,類似於 Java 語言。依賴其面向對象的特點,Jython 具有高度的可擴展性,並為有效的軟件工程提供了最新結構。
Jython 與 Java 語言相似,但不像其他一些腳本編程語言,如 Perl 和 Rexx,它從一開始就設計成一種面向對象的語言。因此,它提供易於理解的強大的面向對象編程 (OOP) 特性。
Jython 最大的優點之一是運行於任何 JVM 上,因此采用 Jython 編碼的應用程序幾乎可以在任何計算系統上運行。
Jython 內置在 Java 平台中。從平台的角度看,Jython 運行時僅僅是另一個 Java 類。如果您深入了解 JYTHON.BAT 文件,這一點就非常明顯,該文件啟動 Java 運行時,而將 Jython 解釋器作為其主類(main class),如下所示:
@echo off
rem This file generated by Jython installer
rem
JAVA_HOME=<java_home>
rem
rem collect all arguments into %ARGS%
set ARGS=
:loop
if [%1] == [] goto end
set ARGS=%ARGS% %1
shift
goto loop
:end
%JAVA_HOME%\bin\java.exe
-Dpython.home=C:\jython-2.1
-cp "C:\jython-2.1\jython.jar;%CLASSPATH%"
org.python.util.jython %ARGS%
|
一切都是解釋型的
Jython 在本質上是一種解釋型語言。 Jython 中沒有預編譯步驟(而 Java 和 C++ 中有這一步),所以每次運行 Jython 代碼時,都會進行重新解釋。同樣,代碼可以快速進行更改和測試。Jython 代碼還可以交互輸入(即一次一行)。此外,您可以動態構造 Jython 代碼(即作為字符串)並直接執行。這樣就可以靈活地進行編碼,而這一點在 Java 編碼中是不可能的。
Jython 解釋器將 Jython 源代碼轉換為內部形式,以便更有效地進行處理。它在檢查語法的第一次傳遞期間執行該項工作。一旦該傳遞完成,則內部化的源文件就被解釋了。Jython 還在磁盤上緩存這種內部化形式。在 Java 類文件中,對於 Jython 模塊 <name>.py,緩存文件將是 <name>$py.class。
解釋執行方式也確實或多或少有些缺點。例如,使用未定義的變量不是編譯器錯誤,因此,只有在使用變量的語句執行時才能被檢測出來。雖然這一點與編譯型語言相比可能是個缺點,但您可以編輯程序,然后立即執行並遇到錯誤(如果存在的話),這一事實會彌補這一缺點。一個簡單的測試-調試步驟所花費的時間和重復進行編輯-編譯步驟來刪除錯誤所費的時間大致相同。
關於性能
由於 Jython 是解釋型語言,所以它可能比編譯型語言(如 Java)慢。在大多數應用程序(如腳本和 GUI)中,這一速度差別幾乎注意不到。在大多數情況下,Jython 所增加的設計和編碼靈活性彌補了任何小的性能損失。
由於 Jython 代碼被動態轉換為 Java 字節碼,所以最新的對 Java 平台(如 JIT 和 Sun 的 HotSpot JVM)的功能增強也可以消除許多性能問題。
使用 Jython
使用 Jython 最容易的方式之一是用作命令行解釋器。在這種方式下,一次輸入一行代碼行,並可以立即看到結果。這是學習 Jython 並用最小開銷嘗試新編碼技術的一種理想方式。
我們從簡要介紹 Jython 交互會話開始。在 ">>>" 或 "..." 提示符后輸入下列命令:
C:\>c:\jython-2.1\jython
應該接收到類似於下面的輸出:
Jython 2.1 on java1.4.1_01 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> 1 + 2 3 >>> "Hello" + "Goodbye" 'HelloGoodbye' >>> def fac(x): ... if x <= 1: return 1 ... return long(x) * fac(x-1) ... >>> fac(3) 6L >>> fac(100) 93326215443944152681699238856266700490715968264381621468592963895217599 99322991560894146397615651828625369792082722375825118521091686400000000 0000000000000000L >>> import sys; sys.exit(0) C:\> |
Notice:如果因字符編碼問題導致命令不可識別,可調整命令行的字符編碼,方法如下
- chcp 65001 就是換成UTF-8代碼頁
- chcp 936 可以換回默認的GBK
- chcp 437 是美國英語
通過這個例子,可以看到輸入會很快得到執行。而輸入包括簡單表達式和更復雜的操作,如函數定義(即 fac 函數)。已定義的值和函數可以立即使用。還應注意,Jython 通過 long 類型支持非常大的整數。
注意上例中 fac 函數的縮進非常重要。在本教程的后面,您將了解有關該要求的更多信息(請參見塊)。
如果 Jython 只接受命令行輸入,那它的用處就不太大;因此,它還允許接受源文件。Jython 源文件以擴展名 .py 結束。Jython 文件必須包含一系列 Jython 語句。表達式,如 1 + 2,並不是有效的語句(雖然執行,但不生成顯示的輸出)。
要顯示表達式,必須將其放在 print 語句中。因此,上一節的序列可以編碼在源文件中,如下所示:
print 1 + 2 print "Hello" + "Goodbye" def fac(x): if x <= 1: return 1 return long(x) * fac(x-1) print fac(3) print fac(100) |
上述代碼產生的輸出與 將 Jython 用作命令行解釋器 例子中的相同。而實際上,這些語句可能已采用交互方式輸入了(在 fac 函數后另加了一個空行),並產生相同的結果。
如前一屏所示,我們使用 print 語句來輸出表達式。該語句采用下列形式:
print expression {, expression}... {,}
-- or --
print
|
上述 print 語句還可以包含由逗號分隔的表達式的列表。表達式輸出時,會自動在兩個表達式之間添加一個空格。因此, print "Hello", "Goodbye" 輸出 Hello Goodbye。
如果 print 語句以逗號結束,則不輸出換行。print 行本身輸出一個換行。
在 Jython 中,典型的示例程序――Hello World――是一個單行文件(名稱為 hello.py),如下所示:
print "Hello World!" |
要運行該程序,應輸入命令:C:\>c:\jython-2.1\jython hello.py
注意必須要有 .py 擴展名,否則將出現 "file not found" 錯誤。jython 命令包含幾個選項。要獲得更多信息,請參見 Jython 主頁(在參考資料中)。
Jython 源文件可以包含一系列要執行的語句。它們還可以包含函數(請參見 Jython 函數 )和類定義(本教程的第 2 部分將討論有關類定義的更多內容)。 實際上,Jython 源文件可以是模塊(稍后將在 模塊和包 中介紹更多內容),而模塊不能直接使用,要由其他程序導入。單個源文件可以扮演兩種角色。請考慮上一屏中該文件的變體,如下所示:
def fac(x):
if x <= 1: return 1
return long(x) * fac(x-1)
if __name__ == "__main__":
print 1 + 2
print "Hello" + "Goodbye"
print fac(3)
print fac(100)
|
同樣,運行該文件會產生與以前相同的結果。但如果文件被導入到另一個只希望重用fac 函數的程序中,則 if (請參見 if 語句)測試條件下的任何一個語句都不執行。
還要注意,每個模塊都有一個名稱,從命令行直接執行的名稱為 "__main__"。該特性可用於為每個模塊創建測試案例。
Jython 源文件可以被編譯成 Java 源代碼(它自動編譯成字節碼)以生成獨立的類或 Java Archive Files (JAR) 文件。要創建直接從 Java 平台調用的 Jython 代碼(比如創建 applet 或 servlet 時),必須執行該步驟。這對於提供 Jython 應用程序而不用發布 Jython 源代碼也很有用。
通過使用 jythonc 命令(即假設您在 Java CLASSPATH 中有必需的 Jython JAR),Jython 可以被編譯成可以直接在任何 JVM 上運行的純 Java 類。有關使用 jythonc 的更多信息,請參見 Jython 主頁(參考資料)。
我們將 factor.py 文件(請參見 參考資料)作為獨立的示例程序。要編譯該程序,請使用命令:
c:\>c:\jython-2.1\jythonc factor.py |
如果沒有出現錯誤,將創建 Java 類文件 factor.class 和 factor$_PyInner.class 。您將在 參考資料 中找到實際生成的 Java 源代碼。要運行該(現在是 Java)應用程序,請使用命令:
c:\><java_home>\bin\java -cp .;c:\jython-2.1\jython.jar factor |
最終輸出與下列內容類似:
factor running...
For -1 result = Exception - only positive integers supported: -1
For 0 result = 1
For 1 result = 1
For 10 result = 3628800
For 100 result =
93326215443944152681699238856266700490715968264381621468592963895217599
99322991560894146397615651828625369792082722375825118521091686400000000
0000000000000000
For 1000 result = 4023872600770937735437024
... many digits removed ...
00000000000000000000
|
注意,這個輸出與直接使用 factor.py 程序生成的輸出相同。
