以下以自己的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成功)
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
2、命令行
>>> import platform
>>> platform.architecture()
windows系统输出是:('64bit', 'WindowsPE')
参考: