1. 程式人生 > >使用Python呼叫Java第三方庫

使用Python呼叫Java第三方庫

先說下我都用了哪些庫:jpype、jython、pyjnius、py4j。這些庫(除了jython是獨立的語言)都可以達到Python執行Java程式碼的作用。而我統統試了個遍。。。

一開始試了一遍,只有jython可以用,其餘的都報各種錯。但是jython有個缺點,就是沒法用編譯器執行,因為.java編譯後的.class沒法再編譯器中讀取,而jython偏偏要執行的就是.class檔案,所以就導致一個現象:在編譯器中編寫jython程式碼,然後在DOS中執行程式碼。。。。顯然很無語,不適合專案使用,只能自己玩玩。所以又跑回去繼續研究jpype,相對來說jpype的資料能多那麼一點點,而且官網也有文件,只不過官網的文件比較過時了,還停留在python2.6和Java6。後來在網上找了很多的資料,其中很多都是直接引用官方的文件,只有少數的原創,而且很多並沒有說的很明白,所以一錯再錯。不過功夫不負有心人,總算還是弄懂了,特寫此文章,供大家參考。

配置:Python2.7.13、Java1.8.0_131

.java路徑:


Javatest程式碼:

package com;

public class Javatest {
	public String run(String str){
		return str;
	}
	public String testParam(String user){
		return "Hi,welcome" + user;
	}
}
編譯後目錄(這裡的.class是我手動轉移的路徑,放在bin或者其他目錄都可以):


打包成test.jar:


(1)使用.class呼叫

#-*-coding:utf-8-*-
import jpype
from jpype import *
#獲得預設jvm路徑,即jvm.dll檔案路徑
jvmPath = jpype.getDefaultJVMPath()
#java擴充套件包路徑
ext_classpath = r'D:\code\H5\run\demo\bin'
jvmArg = '-Djava.class.path=%s'%ext_classpath
print jvmArg
if not jpype.isJVMStarted():
    #啟動Java虛擬機器
    jpype.startJVM(jvmPath,'-ea',jvmArg)
jpype.java.lang.System.out.println('Hello world!')
#獲取相應的Java類
javaClass = JClass("com.Javatest")
javaInstance = javaClass()
#呼叫Java方法
javaInstance.run('123')
#關閉jvm
jpype.shutdownJVM()
注意:這裡的ext_classpath指的是.class檔案的的引用路徑之前的路徑,如:

Javatest.class檔案的全路徑是:D:\code\H5\run\demo\src\com\Javatest.class,Javatest類的包路徑(看上面的目錄結構)是com,所以此處ext_classpath='D:\code\H5\run\demo\src';JClass的路徑就是Javatest類的包路徑:JClass('com.Javatest')

(2)使用jar包呼叫Java類

startJVM(jvmPath, "-ea","-Djava.class.path=test12.jar")
JDClass = JClass("com.Javatest")
jd = JDClass()
jprint = java.lang.System.out.println
print jd.run("waw")
shutdownJVM()
注意:此處的jar用的是相對路徑

檢視jar包裡面的路徑:


好了,大概使用方法就到這了,其實這裡尤其要注意的就是路徑問題,檔案路徑和類的包路徑。