使用 jpype 庫實現 Python 調用 java 的 jar 包中的功能


一、what's the JPype

  JPype 是一個能夠讓 python 代碼方便地調用 Java 代碼的工具。在某些時候 java 的能力更強,我們可以用 java 寫一個模塊的功能然后用 Python 去調用。當然相應的也可以反着來,Java 使用 jython 調用Python

JPype與Jython(JPython后繼者)的區別?

  • 運行環境不同:jython 運行在 jvm 上,而JPype 的實際運行環境仍然是 python runtime,只是在運行期間啟動了一個嵌入的jvm;
  • 使用者不同:jython 用於 Java ,JPype 用於 Python。

JPype安裝

  本人嘗試過直接使用 pip3 install JPype1-py3 的形式,但貌似這樣安裝的版本不是很好,建議使用 wheel 進行安裝

下載地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

  在網頁中找到 jpype,我使用的版本是 Python3,下載的 wheel 是 JPype1‑0.6.3‑cp36‑cp36m‑win_amd64.whl

pip install xxx.wheel
pip install numpy # jpype 依賴於 numpy 

 

二、Java 的安裝及 IDE 的安裝

  最好是 jar 文件在本地打包,本地開發,所以需要有 Java 的環境。不需要安裝的自行跳過。

注意:Python 和JDK 版本需要一致,比如都是 64 bit

配置 Java 環境

  1. 下載 JDK 文件版,本要大於1.7,官網:http://www.oracle.com/,然后傻瓜式安裝
  2. 配置系統變量 JAVA_HOME:變量名 JAVA_HOME,值為 jdk 所在目錄
  3. 配置系統變量 CLASSPATH:變量名 CLASSPATH,值為 ;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
  4. 配置環境變量 PATH:%JAVA__HOME%\bin;%JAVA_HOME%\jre\bin
  5. cmd 中輸入 java -version 能看到版本號就說明 OK 了

 

安裝 IDE

  • 下載 eclipse,官網:http://www.eclipse.org/downloads/
  • 下載完成后,打開,File→new→java project,取消默認勾選的項目,點擊finish
  • 右鍵src,new→class,輸出name,寫一個 Java 的小腳本(演示的腳本文件命名為 JpypeDemo.java)
    public class JpypeDemo {
    public int calc(int a, int b) {
        return a+b;
    }
    
    public static void main(String[]args) {
        JpypeDemo JpypeDemo = new JpypeDemo();
        int a =JpypeDemo.calc(1,2);
        System.out.print(a);
    }
    }

     

將 Java 腳本打包成 jar 包

  1. 將 Java 腳本編譯成 class 文件
    javac JpypeDemo.java # 會生成一個class文件
  2. 打包成 jar 包
    jar cf Demo.jar JpypeDemo.class

     

使用 JPype

 

import jpype
import os

JVM_path = r"C:\Program Files\Java\jdk1.8.0_221\jre\bin\server\jvm.dll" # jvm.dll 是必須的,在jdk文件夾jre\bin\server\jvm.dll下
jarpath =r'C:\Users\zhuminghui\Desktop\demo_test\Demo.jar' # 生成的 jar 包路徑

Djava = "-Djava.class.path="+jarpath
jpype.startJVM(JVM_path,"-ea",Djava)
jpype.java.lang.System.out.println("HelloWorld") # 測試調用 Java 的環境 print
JDClass =jpype.JClass("JpypeDemo") # jar 包中,Java 腳本中定義的類
jd = JDClass() # 實例化
print(jd.calc(1,2)) # 調用方法
# 關閉JVM
jpype.shutdownJVM()

 注意:jvm 只能啟動一次,關閉一次,否則會報錯。

 

坑點記錄

如果 Java 腳本第一行聲明了 package,在調用 JClass 實例化的時候需要做下更改

package aaa
public class JpypeDemo {
public int calc(int a, int b) {
    return a+b;
}

public static void main(String[]args) {
    JpypeDemo JpypeDemo = new JpypeDemo();
    int a =JpypeDemo.calc(1,2);
    System.out.print(a);
}
}
import jpype
import os

JVM_path = r"C:\Program Files\Java\jdk1.8.0_221\jre\bin\server\jvm.dll" # jvm.dll 是必須的,在jdk文件夾jre\bin\server\jvm.dll下
jarpath =r'C:\Users\zhuminghui\Desktop\demo_test\Demo.jar' # 生成的 jar 包路徑

Djava = "-Djava.class.path="+jarpath
jpype.startJVM(JVM_path,"-ea",Djava)
jpype.java.lang.System.out.println("HelloWorld") # 測試調用 Java 的環境 print
JDClass =jpype.JClass("aaa.JpypeDemo") # jar 包中,Java 腳本中定義的類
jd = JDClass() # 實例化
print(jd.calc(1,2)) # 調用方法
# 關閉JVM
jpype.shutdownJVM()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM