1. 程式人生 > >(轉載)Python 的 JPype 模組呼叫 Jar 包 Python 的 JPype 模組呼叫 Jar 包

(轉載)Python 的 JPype 模組呼叫 Jar 包 Python 的 JPype 模組呼叫 Jar 包

Python 的 JPype 模組呼叫 Jar 包

背景與需求

  1. 最近學習並安裝使用了HttpRunner框架去嘗試做介面測試,並有後續在公司推廣的打算。
  2. HttpRunner由Python開發,呼叫介面時需要依賴Python;而大多數公司的擴充套件工具包使用Java編寫,測試同學使用Python重新實現不顯示。
  3. 目前網上的資料均停留在對單個JAR包的引用於使用上,對於使用多個有依賴關係的JAR包的方法並未提及。

JPype介紹

1. JPype是什麼:

JPype是一個能夠讓 python 程式碼方便地呼叫 Java 程式碼的工具,從而克服了 python 在某些領域(如伺服器端程式設計)中的不足。
JPype的實際執行環境仍然是python runtime,只是在執行期間啟動了一個嵌入的jvm。

2. 環境搭建

我的開發環境是: Windows7_64bit + Python3.5_64bit + JDK1.8_64bit + +Jpype_0.5.52 (Python和JDK的位數一定要相同)

  1. 安裝JPype: pip3.5 install JPype1-py3
  2. 找到JRE中的 jvm.dll檔案 (在JDK中的路徑類似如下路徑: F:/Java/jdk1.8.0_45/jre/bin/server/jvm.dll)

3. JPype使用說明

1. 啟動JVM

JPype 提供的 startJVM() 函式的作用是啟動 JAVA 虛擬機器,所以在後續的任何 JAVA 程式碼被呼叫前,必須先呼叫此方法啟動 JAVA 虛擬機器。
jpype.startJVM() 的定義:
startJVM(jvm, *args)

3. 引用第三方JAVA擴充套件包

很多時候,在 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

2. 關閉JVM

當使用完 JVM 後,可以通過 jpype.shutdownJVM() 來關閉 JVM,該函式沒有輸入引數。當 python 程式退出時,JVM 會自動關閉。

4. 實踐

1. 直接呼叫JAVA API

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() 

2. 呼叫JAVA第三方擴充套件包

JAR包原始碼為:

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() 

5. 注意事項

在啟動JVM的時候,預設不會把JDK中 “\jre\lib\ext” 擴充套件包下的JAR包引入,所以為了避免呼叫過程中出現問題,建議將 “\jre\lib\ext” 內的JAR, 均放入我們自己的 "dependency" 目錄,自行匯入。
我在工作中就遇到過使用JAVA呼叫JAR成功,但是使用JPypy呼叫JAR,缺乏ext擴充套件目錄中JAR包的情況。

分類: python 好文要頂 關注我 收藏該文 江詩
關注 - 102
粉絲 - 7 +加關注 0 0 « 上一篇: mysql_config not found和error: command 'gcc' failed with exit status 1
» 下一篇: Appium 測試微信小程式 Webview
posted @ 2018-03-21 11:08 江詩 閱讀( 750) 評論( 0) 編輯 收藏

背景與需求

  1. 最近學習並安裝使用了HttpRunner框架去嘗試做介面測試,並有後續在公司推廣的打算。
  2. HttpRunner由Python開發,呼叫介面時需要依賴Python;而大多數公司的擴充套件工具包使用Java編寫,測試同學使用Python重新實現不顯示。
  3. 目前網上的資料均停留在對單個JAR包的引用於使用上,對於使用多個有依賴關係的JAR包的方法並未提及。

JPype介紹

1. JPype是什麼:

JPype是一個能夠讓 python 程式碼方便地呼叫 Java 程式碼的工具,從而克服了 python 在某些領域(如伺服器端程式設計)中的不足。
JPype的實際執行環境仍然是python runtime,只是在執行期間啟動了一個嵌入的jvm。

2. 環境搭建

我的開發環境是: Windows7_64bit + Python3.5_64bit + JDK1.8_64bit + +Jpype_0.5.52 (Python和JDK的位數一定要相同)

  1. 安裝JPype: pip3.5 install JPype1-py3
  2. 找到JRE中的 jvm.dll檔案 (在JDK中的路徑類似如下路徑: F:/Java/jdk1.8.0_45/jre/bin/server/jvm.dll)

3. JPype使用說明

1. 啟動JVM

JPype 提供的 startJVM() 函式的作用是啟動 JAVA 虛擬機器,所以在後續的任何 JAVA 程式碼被呼叫前,必須先呼叫此方法啟動 JAVA 虛擬機器。
jpype.startJVM() 的定義:
startJVM(jvm, *args)

3. 引用第三方JAVA擴充套件包

很多時候,在 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

2. 關閉JVM

當使用完 JVM 後,可以通過 jpype.shutdownJVM() 來關閉 JVM,該函式沒有輸入引數。當 python 程式退出時,JVM 會自動關閉。

4. 實踐

1. 直接呼叫JAVA API

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() 

2. 呼叫JAVA第三方擴充套件包

JAR包原始碼為:

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() 

5. 注意事項

在啟動JVM的時候,預設不會把JDK中 “\jre\lib\ext” 擴充套件包下的JAR包引入,所以為了避免呼叫過程中出現問題,建議將 “\jre\lib\ext” 內的JAR, 均放入我們自己的 "dependency" 目錄,自行匯入。
我在工作中就遇到過使用JAVA呼叫JAR成功,但是使用JPypy呼叫JAR,缺乏ext擴充套件目錄中JAR包的情況。