在寫這篇隨筆之前,搜索了一下“Jython + 博客園”,發現介紹Jython的文章還是比較少,僅有的那幾篇大部分還是介紹怎么配置Jython。
http://www.cnblogs.com/sesamfox/articles/2313040.html,這篇文章倒是介紹得比較詳細,不過說的是怎么用Jython編程的具體細節問題,我想,一般人在新學習一門語言之前不是馬上去看這種語言的語法細節,而是會先去了解這種語言的特點,什么是其他語言做不到的而這種語言可以輕松做到的,也就是說相較於其他語言有什么特點。了解了這些特點之后,就相當於在看具體的細節之前對這種語言有了一個宏觀的把握,雖然對於其描述的特點一開始可能不能透徹地理解,但是這些可以在具體的學習過程中一點點補充。
這篇隨筆會在結合少量代碼的基礎上着重回答一個問題——Jython可以做什么?
一、Jython的安裝
本文的主要目的是介紹Jython可以做什么,至於Jython怎么安裝在這里只是提一下,http://www.jython.org上有安裝包的下載和安裝過程的介紹。
PS:不同的OS,安裝Jython的方法不一樣,需要配置的環境變量也不一樣,根據自己的系統選擇合適的安裝包,對應的教程。
二、Jython可以做什么
1.Jython是使用java實現的Python,很顯然,Python能做的,Jython也能做。
1 import os 2 3 print("Hello, Jython!!!") 4 print(os.getcwd())
在Jython的解釋器下運行上面的代碼,輸出結果如下:
Hello, Jython!!!
C:\Users\Administrator\workspace\stackoverflow\GX1164
os是Python實現的一個模塊,getcwd函數返回當前的工作目錄。
可以看到,Jython的語法和CPython的語法完全一致。其中,CPython是Python的C語言實現,大部分情況下我們說Python,其實說的就是CPython。
2.Jython可以調用java語言編寫的類
舉個例子,我用java語言寫了一個叫Decimal的類,代碼如下:
1 package Overflow; 2 3 import java.math.*; 4 5 public class Decimal { 6 public void testLog(){ 7 System.out.println(Math.log(2)); 8 } 9 }
使用jar命令將這個類的字節碼文件打包之后,我們就可以在Jython程序中使用這個自己定義的類,下面的測試程序顯示了使用方法
1 import sys 2 sys.path.append("C:/Users/Administrator/workspace/Stack/bin/Overflow.jar") 3 4 import Overflow 5 from java.util import Date 6 7 d = Overflow.Decimal() 8 d.testLog() 9 dd = Date() 10 print(dd)
測試程序的運行結果如下:
0.6931471805599453
Sun Apr 27 10:16:00 CST 2014
這里稍微解釋一下測試程序,sys是Python的另外一個模塊,sys.path.append(dir)的作用是將dir這個目錄加入到環境變量CLASSPATH中,對java稍微了解的人都知道,CLASSPATH這個環境變量的作用是供系統尋找類定義用的,也就是說如果你不加上這條語句,在執行import Overflow這條語句的時候,系統找不到Overflow是在哪定義的,所以會報錯。
導入之后,就可以像使用Python自己定義的類一樣使用自己定義的類了,語法都是一樣的,在本例中,我就使用了Decimal中的testLog函數,0.69314...是log(2)以自然對數為底時的值
細心的讀者可能會注意到,在import Overflow下面還有一行from java.util import Date這樣一行語句,其實這行語句的作用和下面這行語句的作用是一致的
1 import java.util.Date;
只是上面這種寫法是我們在寫java程序的時候用到的。
從輸出結果我們可以看到,在Jython中不僅可以使用自己定義的類,還可以使用java自帶的豐富類庫。
PS:在安裝Jython之前一定要先安裝好JVM,因為Jython是基於JVM的。
3.在java程序中使用Python的系統調用
下面是一個具體的例子
1 package Overflow; 2 3 import org.python.util.PythonInterpreter; 4 import org.python.core.*; 5 public class Jython { 6 public static void main(String[] args) { 7 8 PythonInterpreter interp = 9 new PythonInterpreter(); 10 System.out.println("Hello, brave new world"); 11 interp.exec("import sys"); 12 interp.exec("print sys"); 13 interp.set("a", new PyInteger(42)); 14 interp.exec("print a"); 15 interp.exec("x = 2+2"); 16 PyObject x = interp.get("x"); 17 System.out.println("x: "+x); 18 System.out.println("Goodbye, cruel world"); 19 } 20 }
請注意,這里轉到了java,使用的也是java的語法,但是我們可以通過PythonInterpreter這個對象來完成對Python系統函數的調用。當然,為了使用這個對象,你需要把Jython安裝目錄下的Jyhton.jar加入你的java工程中。
這個例子完全借鑒於下面這篇博客
http://blog.csdn.net/zhongweijian/article/details/4742549
三、總結:
在《The Unix Philosophy》這本書中提到兩點:“舍高效率而取可移植性”和“充分利用軟件的杠桿效應”。
“舍高效率而取可移植性”相信大家都懂,其實“充分利用軟件的杠桿效應”說的是類似的道理,就是說我們在編程的時候沒必要所有的東西都自己實現,別人已經實現過的優秀代碼,我們完全可以借鑒過來,這樣不僅可以節省大量的時間,並且可以集中精力處理自己該處理的那部分代碼,更有可能生產出高質量的代碼。說到底,這兩條無非是說了一個代碼復用的問題。
Jython出現很好地體現了代碼復用這一思想,回顧上面的內容我們可以總結出以下兩點。
1.在使用Python編程時,不管是你自己實現的,還是別人實現的,還是java類庫實現的,只要是.class文件,我們就可以在Python程序中直接使用,而不必再改寫一遍。
2.在使用java編程時,我們可以使用Python實現的豐富類庫。
綜合以上兩點,我們基本上可以得出一個結論:java和Python可以相互調用,這是多么強大的一個特性!
