JPype是一個可以讓 python 代碼方便地調用 Java 代碼的工具,從而克服了 python 在某些領域(如服務器端編程)中的不足。
JPype的實際運行環境仍然是python runtime,只是在運行期間啓動了一個嵌入的jvm。java
個人開發環境是: Windows7_64bit + Python3.5_64bit + JDK1.8_64bit + +Jpype_0.5.52 (Python和JDK的位數必定要相同)python
JPype 提供的 startJVM() 函數的做用是啓動 JAVA 虛擬機,因此在後續的任何 JAVA 代碼被調用前,必須先調用此方法啓動 JAVA 虛擬機。
jpype.startJVM() 的定義:startJVM(jvm, *args)
apache
不少時候,在 python 項目中須要調用第三方的 Java 擴展包,這也是 JPype 的一個重要用途。
經過在 JVM 啓動參數增長:-Djava.class.path = ext_classpath,實如今 Python 代碼中調用已有的 Java 擴展包。
經過在 JVM 啓動參數增長: -Djava.ext.dirs = ext_dirs , 實如今Python 代碼中引入 Java 擴展包的其餘依賴包。編程
注意事項
當有其餘依賴JAR包時,必定要使用-Djava.ext.dirs = ext_dirs進行引入,不然在調用類對象時會報錯:
jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class not found服務器
當使用完 JVM 後,能夠經過 jpype.shutdownJVM() 來關閉 JVM,該函數沒有輸入參數。當 python 程序退出時,JVM 會自動關閉。框架
from jpype import * import os.path startJVM("F:/Java/jdk1.8.0_45/jre/bin/server/jvm.dll", "-ea") java.lang.System.out.println("hello World") shutdownJVM()
JAR包源代碼爲:jvm
package com.test; import org.apache.log4j.Logger; public class MathDemo { public static Logger logger = Logger.getLogger(MathDemo.class.getName()); public int add(int a, int b) { return a+b; } }
將此源碼打包編譯爲:MathDemo.jar,而MathDemo.jar又依賴log4j-1.2.16.jar。函數
Python腳本代碼爲:工具
from jpype import * import jpype jarpath = os.path.join(os.path.abspath('.'), 'F:/JPypeTestl/MathDemo.jar') dependency = os.path.join(os.path.abspath('.'), 'F:/JPypeTestl/dependency') jpype.startJVM("F:/Java/jdk1.8.0_45/jre/bin/server/jvm.dll", "-ea", "-Djava.class.path=%s" %jarpath,"-Djava.ext.dirs=%s" %dependency) #當有依賴的JAR包存在時,必定要使用-Djava.ext.dirs參數進行引入 JClass = jpype.JClass('com.test.MathDemo') instance = JClass() result = (instance.add(10, 20) print (result) jpype.shutdownJVM()
在啓動JVM的時候,默認不會把JDK中 「\jre\lib\ext」 擴展包下的JAR包引入,因此爲了不調用過程當中出現問題,建議將 「\jre\lib\ext」 內的JAR, 均放入咱們本身的 "dependency" 目錄,自行導入。
我在工做中就遇到過使用JAVA調用JAR成功,可是使用JPypy調用JAR,缺少ext擴展目錄中JAR包的狀況。學習