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的工程化性能,可以使开发更加高效。