python调用jar传参_【java配置篇二】跨平台python调用jar包

以下以自己的ocr.jar包在python平台调用为实例,记录全程。

ocr.jar用法

1、导入到自己的项目dependencies中

2、调用函数 OcrandSegmentation( picturePath,serviceUrl,keyPath );

一、python调用方法如下

一、搭建环境

配置:重点(Python和JDK的位数一定要相同)

*JDK 1.8.0_191 64位

python 3.6.9 64位

1、安装JPype:

http://www.lfd.uci.edu/~gohlke/pythonlibs下载对应版本JPype(我下载了JPype1-0.7.0-cp36-cp36m-win_amd64.whl,截止到2019年11月10日为最新版本)

注意:网上教程多为anaconda prompt中命令行:pip install JPype1-py3 ,需要注意该版本已经被deprecated了,还是手动下载保险。

2、安装java环境后,

找到JRE中的jvm.dll 文件(在JDK中的路径类似如下路径: D:/java/jdk1.8.0_191/jre/bin/server/jvm.dll)

二、Python脚本调用

1、依赖包的替换:

如果你的jar包内有import,在自己的idea中查看引用的哪个jar包。在启动JVM的时候,默认不会把JDK中"\jre\lib\ext"扩展包下的JAR包引入,所以为了避免调用过程中出现问题,建议将"\jre\lib\ext"内的JAR,均放入我们自己建的"dependency"目录,自行导入。

在语义分割代码中,我们有对rt.jar的依赖关系。

找到JRE中的rt.jar(在JDK中的路径类似如下路径:D:\\java\\jdk1.8.0_191\\jre\\lib\\rt.jar),复制并替换ocr.jar旁边的dependency文件夹内的rt.jar。

2、python脚本

from jpype import *

import jpype

import os

#jar包路径

jarpath = os.path.join(os.path.abspath('.'), 'E:\\PYProject\\testocr\\jar\\ocr.jar')

#依赖包路径

#当有依赖的JAR包存在时,一定要使用-Djava.ext.dirs参数进行引入

dependency = os.path.join(os.path.abspath('.'),

'E:\\PYProject\\testocr\\jar\\rt.jar')

#启动JVM

jpype.startJVM("D:/java/jdk1.8.0_191/jre/bin/server/jvm.dll", "-ea", "-Djava.class.path=%s" % jarpath,

"-Djava.ext.dirs=%s" % dependency)

#获取class实例,注意 package.className替换为自己的包名和类名

JClass = jpype.JClass('hehe.ocr')

instance = JClass()

#调用我的jar包接口

picturePath = "C:\\xxx\\xx\\1.jpg"

serviceUrl = "http://xxxx/xxx/xxxx"

keyPath = "E:\\xxxxx\\key.txt"

#调用方法与java类似,实例.方法名

result = (instance.OcrandSegmentation(picturePath, serviceUrl, keyPath))

print(result)

#程序最后记得最后关闭jvm

jpype.shutdownJVM()

3、报错后通常解决方案

1、更新numpy,卸载重装或者 pip -U numpy

2、下载正确版本Jpype,卸载重装当前version(第一次装成0.6版 大小只有200K,运行一直报错jpype没有startJVM的函数。卸载重装JPype1-0.7.0版,并更新numpy,启动JVM成功)

1452087-20191114171550323-586524140.png

3、JVM无法连续启动。jpype有一个致命弱点在于JVM只能启动一次,且关闭后无法重新启动(内部机制问题)。由于作者这次的目的是将jar包导入后,使用python语言发一个"长期开启且会被重复调用"的服务,临时的解决方法如下:

将启动JVM与jar包类实例化的代码抽取成一个方法,使用python语言的全局变量(global)标志一下JVM的初次启动。再次调用时标志符为true表示已经开启,无需调用。

二、ocr.jar包接口介绍

调用一个方法,传入三个参数:

@picturePath=图片路径;

@serviceUrl = 服务url(根据服务器的ip变化,修改192.168.0.102部分)

@keyPath =数据字典的存放路径;

返回值:String 四种可能的结果如下:

String ServiceErrorMessage = "--\n" + "第三方服务调用出错" + "\n--\n";

String PictureErrorMessage = "*****";//服务直接识别结果

String FileNotFoundMessage ="****";

String rightMessage = "****"//Hashmap转字符串(格式参考result.txt)

三、java调用代码如下

String picturePath = "1.jpg";

String serviceUrl = "http://xxxxxxx";

String keyPath ="src/key.txt";

String result = null;

result = OcrandSegmentation(picturePath,serviceUrl,keyPath );

附:python查看版本

1、命令行 python

1452087-20191114171550786-1982919974.png

2、命令行

>>> import platform

>>> platform.architecture()

windows系统输出是:('64bit', 'WindowsPE')

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值