您的位置:首页 > 编程语言 > Python开发

python调用java

2017-07-25 21:01 357 查看
使用JPype来让Python调用JavaAPI。JPype的下载地址:https://pypi.python.org/pypi/JPype1JPype的帮助文档:http://jpype.readthedocs.io/en/latest/

1、安装:

// 如过已经安装过,请略过这两步
yum install gcc
yum install gcc-c++

// 安装python-devel , 避免报错:error: command 'gcc' failed with exit status 1
yum install python-devel
// 至于pip的安装,请参考:http://blog.csdn.net/xlxxcc/article/details/60958604
pip install jpype1
1234567812345678

2、测试代码:

新建test.py, 代码如下:
from jpype import *
startJVM(getDefaultJVMPath(), "-ea")
java.lang.System.out.println("Hello World")
shutdownJVM()
12341234运行test.py,
python test.py
11结果如下:
Hello World
JVM activity report:
classes loaded  : 31
JVM has been shutdown
12341234

3、引用jar包:

在com目录下新建文件Test.Java
package com;
public class Test {
public String run(String str){
return str;
}
}
123456123456编译、打包
// 编译
javac Test.java

// 打包,必须把整个目录(报名和目录名要对应)打包,否则无法访问类。
jar cvf test.jar com
1234512345p4000ython调用
jarpath = os.path.join(os.path.abspath('.'), 'libs/test.jar')
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=%s" % jarpath)
Test = jpype.JClass('com.Test')
# 或者通过JPackage引用Test类
# com = jpype.JPackage('com')
# Test = com.Test
t = Test()
res = t.run("a")
print res
jpype.shutdownJVM()
jpype的介绍

python调用Java-JPype使用介绍

标签:pythonjava 2015-04-14 16:13 10024人阅读 评论(1) 收藏 举报Python 作为一种灵活的软件开发语言在当今被广泛使用。在软件开发过程中,有时需要在 python 项目中利用既有的 Java 代码,已达到节省时间和开发成本的目的。因此,找到一个 Python 代码调用 Java 代码的桥梁是非常有意义的。 JPype 就是这样的一个工具,利用它可以使 Python 程序方便的调用 Java 代码,从而扩充 Python 语言的能力,弥补 Python 语言的不足。本文介绍了如何利用 JPype 整合 Python 程序和 Java 程序的一些基本方法。概览JPype 是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足。下载JPype 可以从 sourceforge 网站上下载:http://sourceforge.net/projects/jpype/ 目前 JPype 最新的版本为 0.5.4,支持 python 2.5 和 2.6. 本文以 Windows XP 平台,python 2.5.4 为例阐述。安装安装 JPype 前需要先安装 python 。从 http://www.python.org/download 下载 python 并安装,安装路径选择 C:\Python25\,安装完成后在本地 C 盘应有 C:\Python25 目录,该目录下有 python.exe 文件。 Python 安装完后,双击下载的 JPype 安装文件即可安装 JPype 。许可证JPype 遵循的许可证是 Apache License V2.0 。JPype 的使用一个简单的 hello world 程序下面是一个简单的 python 程序,通过 JPype 调用 Java 的打印函数,打印出字符串。清单 1. hello world
import jpype  jvmPath = jpype.getDefaultJVMPath()  jpype.startJVM(jvmPath)  jpype.java.lang.System.out.println( “ hello world! ” )  jpype.shutdownJVM()
启动 JVMJPype 提供的 startJVM() 函数的作用是启动 JAVA 虚拟机,所以在后续的任何 JAVA 代码被调用前,必须先调用此方法启动 JAVA 虚拟机。·        jpype.startJVM() 的定义
startJVM(jvm, *args)
·         ·        jpype.startJVM() 的参数参数 1: jvm, 描述你系统中 jvm.dll 文件所在的路径,如“ C:\ProgramFiles\IBM\Java50\jre\bin\j9vm\jvm.dll ”。可以通过调用 jpype.getDefaultJVMPath() 得到默认的 JVM 路径。参数 2: args, 为可选参数,会被 JPype 直接传递给 JVM 作为 Java 虚拟机的启动参数。此处适合所有合法的 JVM 启动参数,例如:
 -agentlib:libname[=options]  -classpath classpath  -verbose  -Xint
 清单 2. jpype.startJVM() 的用法示例
import jpype  jvmPath = jpype.getDefaultJVMPath()  jvmArg = “ -Xint ” jpype.startJVM(jvmPath,jvmArg)
判断 JVM 是否启动JPype 提供的 jpype.isJVMStarted() 函数的作用是判断 JVM 是否已启动。·        jpype.isJVMStarted() 的定义 isJVMStarted()·        jpype.isJVMStarted() 的返回值返回值为 True 表示 JVM 已经启动,返回值为 False 表示 JVM 还未启动清单 3.jpype.isJVMStarted() 的用法示例
import jpype  jvmPath = jpype.getDefaultJVMPath()  jvmArg = “ -Xint ” if not jpype.isJVMStarted():     jpype.startJVM(jvmPath,jvmArg)
关闭 JVM当使用完 JVM 后,可以通过jpype.shutdownJVM() 来关闭 JVM,该函数没有输入参数。当 python 程序退出时,JVM 会自动关闭。引用第三方的 Java 扩展包很多时候,在 python 项目中需要调用第三方的 Java 扩展包,这也是 JPype 的一个重要用途。为了使编程者方便地在 python 代码中调用已有的 Java 扩展包,我们可以再在 JVM 启动参数增加:-Djava.class.path=ext_classpath以下为调用第三方 Java 扩展包示例,(假设第三方 Java 扩展包的所在路径是 E:\JavaExt)清单 4. 调用第三方 Java 扩展包示例
import jpype  jvmPath = jpype.getDefaultJVMPath()  ext_classpath = “ E:\\JavaExt ” jvmArg = “ -Djava.class.path = ” + ext_classpath  if not jpype.isJVMStarted():     jpype.startJVM(jvmPath, jvmArg)
访问 Java 的系统属性有时,某些 Java 应用需要设置或者获取 JVM 中的系统属性。·        在 JVM 启动时设置系统变量示例:·        在 JVM 的启动参数中加入如下参数:-Dproperty=value 假设你要设置的属性名为 yourProperty,属性值为 yourValue 。清单 5. JVM 启动时设置系统变量示例
import jpype  jvmPath = jpype.getDefaultJVMPath()  jvmArg = “ -DyourProperty=yourValue ” if not jpype.isJVMStarted():     jpype.startJVM(jvmPath,jvmArg)
清单 6. 在程序中设置系统变量示例
import jpype  prop = “ yourProperty ” value = “ yourValue ” system = jpype.JClass('java.lang.System')  system.setProperty(str(prop),str(value))
清单 7. 在程序中获取系统变量示例
import jpype  prop = “ yourProperty ” system = jpype.JClass('java.lang.System')  value = system.getProperty(str(prop))
Java 类型到 python 类型的转换表 1. Java 类型到 python 类型的转换
Java 类型转换成的 python 类型
byte, short and intint
longlong
float and doublefloat
booleanint of value 1 or 0
charunicode of length 1
Stringunicode
arraysJArray
other Java objectJavaObject
ClassJavaClass
array ClassJavaArrayClass
 使用 Java 对象清单 8. Java 类定义
package src.com.ibm.javaproject;   public class JavaClass {     public String value = "";      /**      * Creates a new JavaClass object.      *      * @param value      */  public JavaClass(String value) {         this.value = value;     }      public String getValue() {         return this.value;     }      public void setValue(String val) {         this.value = val;     }  }
对于上述的 Java 类,以下的代码介绍了如何在 Python 中构造并且使用相应的对象。首先是获得对应 Java 类:清单 9. 获得对应 Java 类
import jpype  javaClass = jpype.JClass('src.com.ibm.javaproject.JavaClass')
调用 Java 类的构造函数生成实例:清单 10. 调用 Java 类的构造函数生成实例
value = “ oldvalue ” javaInstance = javaClass(value)
调用 Java 方法:清单 11. 调用 Java 方法
print javaInstance.getValue()  javaInstance.setValue( “ newvalue ” )  print javaInstance.getValue()
运行结果:清单 12. Python 代码的运行结果
oldvalue  newvalue
Java exception 错误处理异常处理是程序编写者们必须考虑的问题,在使用 JPype 的过程中,所有的 java exception 将被自动转换成 jpype.JavaException 。以下是 Jpype 处理 Java exception 的示例:清单 13. 处理 Java exception
from jpype import JavaException  try:     #Code that throws a java.lang.RuntimeException  except JavaException, ex:     if JavaException.javaClass() is java.lang.RuntimeException:         print "Caught the runtime exception : ", JavaException.message()        print JavaException.stackTrace()
应用实例(Password Cipher)下面我们用一个简单的应用实例来说明如何在 python 代码中调用 Java 类。Java 类定义假设我们已用 Java 语言编写了一个类:PasswordCipher,该类的功能是对字符串进行加密和解密。它提供了一个对外的接口 run() 函数,定义如下 :清单 14. PasswordCipher 定义
public class PasswordCipher {     ……    public static String run(String action, String para){     ……    } …… }
run 函数接收两个参数,第一个参数代表所要进行的操作,传入“ encrypt ”表示对第二个参数 para 做加密操作,返回加密结果。如果第一个参数为“ decrypt ”则返回对 para 的解密操作的结果。在 run 函数中有可能会有异常抛出。Python 代码我们先将 PasswordCipher.class 存放在目录“ F:\test\cipher ”下,然后用 python 语言编写下面的代码:清单 15. Python 代码
import jpype  from jpype import JavaException   jvmPath = jpype.getDefaultJVMPath()           #the path of jvm.dll classpath = "F:\\test\\cipher"                 #the path of PasswordCipher.class jvmArg = "-Djava.class.path=" + classpath  if not jpype.isJVMStarted():                    #test whether the JVM is started    jpype.startJVM(jvmPath,jvmArg)             #start JVM  javaClass = jpype.JClass("PasswordCipher")   #create the Java class try:     testString = "congratulations"     print "original string is : ", testString     #call the run function of Java class     encryptedString = javaClass.run("encrypt", testString)     print "encrypted string is : ", encryptedString      #call the run function of Java class      decryptedString = javaClass.run("decrypt", encryptedString)     print "decryped string is : ", decryptedString  except JavaException, ex:     print "Caught exception : ", JavaException.message()     print JavaException.stackTrace()  except:     print "Unknown Error"  finally:     jpype.shutdownJVM()        #shut down JVM
运行该程序后得到的结果:清单 16. 该程序运行的结果是:
original string is :  congratulations  encrypted string is :  B0CL+niNYwJLgx/9tisAcQ==  decryped string is :  congratulations
 参考资料·        访问 JPype 的主页,了解更多 JPype 的内容。 ·        访问 developerWorks 开放源码专区,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: