Python調用Java代碼的橋梁:JPype
JPype 是 Python 代碼調用 Java 代碼的橋梁。利用它可以使 Python 程序方便的調用 Java 代碼,從而擴充 Python 語言的能力,彌補 Python 語言的不足。
概覽
JPype 是一個能夠讓 python 代碼方便地調用 Java 代碼的工具,從而克服了 python 在某些領域(如服務器端編程)中的不足。
下載
JPype 可以從 sourceforge 網站上下載:http://sourceforge.net/projects/jpype/ 目前 JPype 最新的版本為 0.5.4,支持 python 2.5 和 2.6. 本文以 Windows XP 平臺,python 2.5.4 為例闡述。
安裝
安裝 JPype 前需要先安裝 python 。從 http://www.python.org/download 下載 python 并安裝,安裝路徑選擇 C:\Python25\,安裝完成后在本地 C 盤應有 C:\Python25 目錄,該目錄下有 python.exe 文件。 Python 安裝完后,雙擊下載的 JPype 安裝文件即可安裝 JPype 。
許可證
JPype 遵循的許可證是 Apache License V2.0 。
JPype 的使用
一個簡單的 hello world 程序
下面是一個簡單的 python 程序,通過 JPype 調用 Java 的打印函數,打印出字符串。
清單 1. hello world
import jpype
jvmPath = jpype.getDefaultJVMPath()
jpype.startJVM(jvmPath)
jpype.java.lang.System.out.println( “ hello world! ” )
jpype.shutdownJVM()
啟動 JVM
JPype 提供的 startJVM() 函數的作用是啟動 JAVA 虛擬機,所以在后續的任何 JAVA 代碼被調用前,必須先調用此方法啟動 JAVA 虛擬機。
jpype.startJVM() 的定義
startJVM(jvm, *args)
jpype.startJVM() 的參數
參數 1: jvm, 描述你系統中 jvm.dll 文件所在的路徑,如“ C:\Program Files\IBM\Java50\jre\bin\j9vm\jvm.dll ”。可以通過調用 jpype.getDefaultJVMPath() 得到默認的 JVM 路徑。
參數 2: args, 為可選參數,會被 JPype 直接傳遞給 JVM 作為 Java 虛擬機的啟動參數。此處適合所有合法的 JVM 啟動參數,例如:
-agentlib:libname[=options]
-classpath classpath
-verbose
-Xint
清單 2. jpype.startJVM() 的用法示例
import jpype
jvmPath = jpype.getDefaultJVMPath()
jvmArg = “ -Xint ”
jpype.startJVM(jvmPath,jvmArg)
判斷 JVM 是否啟動
JPype 提供的 jpype.isJVMStarted() 函數的作用是判斷 JVM 是否已啟動。
jpype.isJVMStarted() 的定義
isJVMStarted()
jpype.isJVMStarted() 的返回值
返回值為 True 表示 JVM 已經啟動,返回值為 False 表示 JVM 還未啟動
清單 3. jpype.isJVMStarted() 的用法示例
import jpype
jvmPath = jpype.getDefaultJVMPath()
jvmArg = “ -Xint ”
if not jpype.isJVMStarted():
jpype.startJVM(jvmPath,jvmArg)
關閉 JVM
當使用完 JVM 后,可以通過 jpype.shutdownJVM() 來關閉 JVM,該函數沒有輸入參數。當 python 程序退出時,JVM 會自動關閉。
引用第三方的 Java 擴展包
很多時候,在 python 項目中需要調用第三方的 Java 擴展包,這也是 JPype 的一個重要用途。為了使編程者方便地在 python 代碼中調用已有的 Java 擴展包,我們可以再在 JVM 啟動參數增加:
-Djava.class.path=ext_classpath
以下為調用第三方 Java 擴展包示例,(假設第三方 Java 擴展包的所在路徑是 E:\JavaExt)
清單 4. 調用第三方 Java 擴展包示例
import jpype
jvmPath = jpype.getDefaultJVMPath()
ext_classpath = “ E:\JavaExt ”
jvmArg = “ -Djava.class.path = ” + ext_classpath
if not jpype.isJVMStarted():
jpype.startJVM(jvmPath, jvmArg)
訪問 Java 的系統屬性
有時,某些 Java 應用需要設置或者獲取 JVM 中的系統屬性。
在 JVM 啟動時設置系統變量示例:
在 JVM 的啟動參數中加入如下參數:
-Dproperty=value
假設你要設置的屬性名為 yourProperty,屬性值為 yourValue 。
清單 5. JVM 啟動時設置系統變量示例
import jpype
jvmPath = jpype.getDefaultJVMPath()
jvmArg = “ -DyourProperty=yourValue ”
if not jpype.isJVMStarted():
jpype.startJVM(jvmPath,jvmArg)
清單 6. 在程序中設置系統變量示例
import jpype
prop = “ yourProperty ”
value = “ yourValue ”
system = jpype.JClass('java.lang.System')
system.setProperty(str(prop),str(value))
清單 7. 在程序中獲取系統變量示例
import jpype
prop = “ yourProperty ”
system = jpype.JClass('java.lang.System')
value = system.getProperty(str(prop))
Java 類型到 python 類型的轉換
表 1. Java 類型到 python 類型的轉換
Java 類型 轉換成的 python 類型
byte, short and int int
long long
float and double float
boolean int of value 1 or 0
char unicode of length 1
String unicode
arrays JArray
other Java object JavaObject
Class JavaClass
array Class JavaArrayClass