一、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 環境
- 下載 JDK 文件版,本要大於1.7,官網:http://www.oracle.com/,然后傻瓜式安裝
- 配置系統變量 JAVA_HOME:變量名 JAVA_HOME,值為 jdk 所在目錄
- 配置系統變量 CLASSPATH:變量名 CLASSPATH,值為 ;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
- 配置環境變量 PATH:%JAVA__HOME%\bin;%JAVA_HOME%\jre\bin
- 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 包
- 將 Java 腳本編譯成 class 文件
javac JpypeDemo.java # 會生成一個class文件
- 打包成 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()