Python的JAVA膠水——jpype


Python的JAVA膠水——jpype

python可以作為一門膠水語言使用,可以用其它語言的優勢來彌補自身如性能方面的不足,jpype就是在Python中使用jvm的第三方庫

文檔在這里

安裝

sudo pip jpype1 #注意后面有一個1,參考官網

配置安裝JAVA環境本文就不再贅述

helloworld

  • 設置參數啟動JAVA虛擬機
  • 運行JAVA代碼
  • 關閉虛擬機
#coding=utf=8

import jpype

jvmPath = jpype.getDefaultJVMPath() # 獲得系統的jvm路徑
jpype.startJVM(jvmpath=jvmPath) # 啟動虛擬機
# 執行JAVA代碼
jpype.java.lang.System.out.println("hello world")
jpype.shutdownJVM() # 關閉jvm

-------------------------------------------
hello world
JVM activity report     :
	classes loaded       : 31
JVM has been shutdown

使用Java中的對象

jpype還支持直接使用編譯后的class文件,省去了編譯這一環節。

一下是原來的JAVA測試代碼

package com;
public class JavaClass
{
    String value;
    public JavaClass(String value)
    { 
        this.value = value+" Java"; 
    } 
    public String getValue()
    { 
        return this.value;
    }
    public void say()
    {
        System.out.println("hello java");
    }
    public static void main(String[] args) {
        System.out.println("hello world");    
    }
 }

編譯后產生JAVA字節碼

java -cp com  com.JavaClass

現在的文件結構如下

./
├── com
│   └── JavaClass.class
└── testJava.py

Python代碼如下:

#coding=utf=8

import jpype

jvmPath = jpype.getDefaultJVMPath() # 獲得系統的jvm路徑
# 啟動虛擬機
if not jpype.isJVMStarted():
    jpype.startJVM(jvm=jvmPath)
# 使用JAVA字節碼中定義的類
javaClass = jpype.JClass('com.JavaClass')
# 實例化對象
javaInstance = javaClass('test')
#調用JAVA對象的方法
print javaInstance.getValue()
javaInstance.say()

# 關閉jvm
jpype.shutdownJVM()

-------------------------------------------
test Java
hello java
JVM activity report     :
	classes loaded       : 20
JVM has been shutdown

添加jar包

原TestApi.java代碼

package test;  
  
public class TestApi  
{  
    public String getData(String key){  
        return key;  
    }  
    public void printData(String key){  
        System.out.println(key);  
    }  
      
    public static void main(String[] args)  
    {  
        System.out.println(123);  
    }  
}

打包成jar后可以使用Python來調用

#coding=utf-8

import jpype

jvmPath = jpype.getDefaultJVMPath()

# 用來添加JAVA虛擬機命令行參數
ext_classpath = './TestApi.jar'
jvmArg = '-Djava.class.path=' + ext_classpath

if not jpype.isJVMStarted():
    jpype.startJVM(jvmPath, jvmArg)
    TA = jpype.JPackage('test').TestApi #這種用法可以簡化后面的書寫
    jd = TA()
    jd.printData('1234')
    s = jd.getData('a')
    print s
    system = jpype.java.lang.System #這里也是獲得了System
    system.out.println("call system method")
jpype.shutdownJVM()

此例中,同時還使用了JAVA虛擬機啟動時的命令行參數,可以訂制啟動方式

小結

jpype提供了強大而靈活的JAVA虛擬機接口,使得Python的擴展性進一步提升,Python的優雅語法,配上JAVA的工程化性能,可以使開發更加高效。


免責聲明!

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



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