环境准备:

部署环境准备:
sed -i.ori '$a export JAVA_HOME=/opt/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
source /etc/profile java -version
yum install -y python3
mv /etc/yum.repos.d/mcwbak/* /etc/yum.repos.d/
yum install -y python3
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
pip install jpype
tar xf jpype-0.0.tar.gz
python setup.py install
pip install jpype1

简介: 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

#/usr/bin/env python3
import jpype
jvmPath = jpype.getDefaultJVMPath()
jpype.startJVM(jvmPath)
jpype.java.lang.System.out.println( " hello world! " )
jpype.shutdownJVM()

启动 JVM

JPype 提供的 startJVM() 函数的作用是启动 JAVA 虚拟机,所以在后续的任何 JAVA 代码被调用前,必须先调用此方法启动 JAVA 虚拟机。

  • jpype.startJVM() 的定义

    startJVM(jvm, *args)
  • jpype.startJVM() 的参数

    参数 1: jvm, 描述你系统中 jvm.dll 文件所在的路径,如“ C:\Program Files\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))

添加上启动jvm

import jpype
prop = "yourProperty"
value = "yourValue"
jvmPath = jpype.getDefaultJVMPath()
jpype.startJVM(jvmPath)
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))
print(value)

启动jvm,设置环境变量。获取并打印环境变量

import jpype
prop = "yourProperty"
value = "yourValue"
jvmPath = jpype.getDefaultJVMPath()
jpype.startJVM(jvmPath)
system = jpype.JClass('java.lang.System')
system.setProperty(str(prop),str(value))
value = system.getProperty(str(prop))
print(value)

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 int int
long long
float and double float
boolean int of value 1 or 0
char unicode of length 1
String unicode
arrays JArray
other Java object JavaObject
Class JavaClass
array Class JavaArrayClass

使用 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

原文链接:http://www.pythontip.com/blog/post/4245/

jpype-python调用java的方法的更多相关文章

  1. PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。

    PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...

  2. Python调用Java代码部署及初步使用

    Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...

  3. Python调用Java(基于Ubuntu 18.04)

    最近实习,需要使用Python编程,其中牵涉到一些算法的编写.由于不熟悉Python,又懒得从头学,而且要写的算法自己之前又用Java实现过,就想着能不能用Python调用Java.经过查找资料,方法 ...

  4. python调用java&反编译地址

    反编译工具地址: https://github.com/java-decompiler/jd-gui/releases 你想知道的JPype全在这里∞   先总结自己趟的坑 1. python进程是6 ...

  5. 自然语言处理工具python调用hanlp的方法步骤

    Python调用hanlp的方法此前有分享过,本篇文章分享自“逍遥自在017”的博客,个别处有修改,阅读时请注意! 1.首先安装jpype 首先各种坑,jdk和python 版本位数必须一致,我用的是 ...

  6. python 调用 shell 命令方法

    python调用shell命令方法 1.os.system(cmd) 缺点:不能获取返回值 2.os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等   ...

  7. 在ASP.Net环境中,当用户点击报表中的超链接时如何调用Java Script方法?

    问题描述:在ASP.Net环境中,当用户点击报表中的超链接时如何调用Java Script方法? 问题解答: 你可以在TextObject.Hyperlink对象中编写js代码(javascript: ...

  8. 在linux下sh批处理文件调用java的方法

    解密 java -classpath collection-impl-0.0.1.jar com.ai.toptea.collection.message.DESEncrypt 1EFE4663895 ...

  9. Android-WebView与本地HTML (HTML调用-->Java的方法)

    上一篇博客 Android-WebView加载网络图片&网页 介绍了 使用WebView去加载网络上的图片与网页; 此篇博客专门介绍 Android-WebView与本地HTML (HTML调 ...

  10. C通过JNI反向调用JAVA程序方法

    JNI反向调用JAVA程序 引述:上文讲过java线程---OS线程的关系,然后C怎样反向调用JAVA程序方法是我们这篇讲的重点 1.ThreadTest中添加run()方法 2.编译ThreadTe ...

随机推荐

  1. JDK14中的java tools简介

    目录 故事发生了 java tools简介 jaotc jar jarsigner java javac javadoc javap jcmd jconsole jdb jdeprscan jdeps ...

  2. Wasm软件生态系统安全分析

    演讲嘉宾 | 王浩宇 回顾整理 | 廖   涛 排版校对 | 李萍萍 嘉宾简介 王浩宇,华中科技大学教授,博士生导师,华中科技大学OpenHarmony技术俱乐部主任.研究关注于新兴软件系统中的安全. ...

  3. 数据库操作入门:PyMongo 和 MongoDB 的基本用法

    MongoDB MongoDB是一种流行的NoSQL数据库,它将数据存储在类似JSON的文档中,使数据库非常灵活和可扩展 PyMongo Python需要一个MongoDB驱动程序来访问MongoDB ...

  4. Numpy结构化数组

    Numpy结构化数组 Numpy的结构化数组和记录数组为复合的.异构的的数据提供了非常有效的存储. 结构化数组 In [1]: import numpy as np In [2]: name = [' ...

  5. 【直播回顾】Hello HarmonyOS进阶课程第五课——原子化服务

    由HDE李洋老师主讲的Hello HarmonyOS进阶系列应用篇第五课<原子化服务>, 已于6月1日晚上 19 点在HarmonyOS社群内成功举行.本节课李洋老师带领大家了解Harmo ...

  6. SVM三则

    硬间隔SVM SVM被提出来, 解决模式识别中, 数据的分类问题,属于有监督算法中的一种, 如上图所示, 于其他的线性回归方式不同, SVM企图去寻找一个最完美的超平面, 因为能正确分类样本的线, 它 ...

  7. 基础 IO (Linux学习笔记)

    基础IO 1.重谈文件 空文件在磁盘也要占据空间 文件 = 内容 + 属性 文件操作 = 对文件内容+对属性 or 对文件内容加属性 标定一个文件,必须使用文件路径加文件名[唯一性] 如果没有指明对应 ...

  8. 探索Kimi智能助手:如何用超长文本解锁高效信息处理新境界

    目前,Kimi备受瞩目,不仅在社交平台上引起了广泛关注,而且在解决我们的实际问题方面也显示出了巨大潜力.其支持超长文本的特性使得我们能够更加灵活地配置信息,避免了频繁与向量数据库进行交互以及编写提示词 ...

  9. PolarDB for PostgreSQL 内核解读 :HTAP架构介绍

    简介:在 PolarDB 存储计算分离的架构基础上我们研发了基于共享存储的MPP架构步具备了 HTAP 的能力,对一套 TP的数据支持两套执行引擎:单机执行引擎用于处理高并发的 OLTP:MPP跨机分 ...

  10. Flink 在唯品会的实践

    简介: Flink 在唯品会的容器化实践应用以及产品化经验. 唯品会自 2017 年开始基于 k8s 深入打造高性能.稳定.可靠.易用的实时计算平台,支持唯品会内部业务在平时以及大促的平稳运行.现平台 ...