python呼叫第三方java包例項
先看結果:
對於python與java的互調,我一開始是用的py4j,但是後來發現在使用方法的時候,不知道如何在python中匯入jar包,然後網上的資料也比較少。後來想不出來辦法,又看到有Jpype這個東東。博友們說Jpype的安裝比較不好安裝,容易出錯,建議用whl檔案安裝,我這裡pip install jpype,倒是沒出現問題,很快就下載好了。
先說一下Jpype,它是一個讓python 程式碼方便地呼叫 Java 程式碼的工具,從而克服了 python 在某些領域(如伺服器端程式設計)中的不足。
python端:
os.path.abspath這個函式用來獲取當前 python 指令碼(即py檔案)所在的絕對路徑, startJVM是用來開啟JVM的,啟動java虛擬機器,所以在後續的任何 JAVA 程式碼被呼叫前,必須先呼叫此方法啟動 Java虛擬機器。其中,jvm,用於描述你係統中 jvm.dll 檔案所在的路徑,這個可以利用函式getDefaultJVMPath()獲得。"-Djava.class.path=%s"% jarpath,此處非常關鍵,能實現在 python 程式碼中呼叫第三方Java 擴充套件包。(這裡需要你把jar檔案拷貝到python指令碼檔案的目錄下。相應地,jpype.shutdownJVM() 用來關閉 JVM,該函式沒有輸入引數。當 python 程式退出時,JVM 會自動關閉。JDClass = JClass("basicTools.MathFuns") 是申請一個java類,用來呼叫方法。
程式碼:
'''
import jpype from jpype import * import os.path jarpath=os.path.join(os.path.abspath('.'),"MathFuns.jar")#os.path.abspath這個函式用來獲取當前 python 指令碼所在的絕對路徑 print(os.path.abspath('.')) startJVM(getDefaultJVMPath(),"-ea","-Djava.class.path=%s"% jarpath)#"D:/jdk/jre/bin/server/jvm.dll" JDClass = JClass("basicTools.MathFuns") #申請一個java類 jd = JDClass()#例項化 jprint = java.lang.System.out.println #申請 Java 輸出類的輸出函式 jprint("hello World") jprint(jd.isEqual([1,2,3],[1,4,3]))#呼叫類的isEqual方法,判斷兩個陣列是否相等 jpype.shutdownJVM()#關閉JVM
java端:
我下載了客戶端eclipse,然後將MathFuns包匯入在專案中,匯入以後,就位於Referenced Libraries資料夾中了,如圖所示:
。應該這樣匯入就好了,點開,可以看到有資料夾basicTools,MathFuns類。說到這裡,我之前執行python端的時候出現了總是找不到MathFuns類的錯誤,找了很久都沒有解決。最後竟然在類的前面加了basicTools,才解決了這個錯誤。所以,這裡需注意,看看你是否有這樣的一個資料夾。如果有,那就加上,如果沒有,那就直接在申請java類的時候,直接寫類名就好。