Jython可以做什么


在寫這篇隨筆之前,搜索了一下“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可以相互調用,這是多么強大的一個特性!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM