Python调用Jar包的两种方式小结
作者:Wintersee 发布时间:2023-07-26 06:29:12
概览
因工作场景,需要在python代码里调用Jar包来实现一些功能,调研下来主要有两种方式:
java -jar xx.jar
JPype
环境配置
因为要在公司内网操作,所以需要通过离线方式进行安装。环境用的是一个Centos7.7的docker镜像。
安装JDK
主要有三种方式:
1. 通过yum源安装
2. rpm安装
3. 解压JDK安装包手动安装
第一种方式需要联网或者配置内网的yum源
第三种方式比较繁琐且需要配置环境变量,相较而言第二种方式比较适合我这一次的场景
具体安装细节不再赘述,详情可参考这篇文章:CentOS安装jdk的几种方法及配置环境变量
安装JPype(如需要)
同样的,可以通过pip直接在线安装,也可以通过python setup.py install或者pip install xx.whl离线安装,可参考Python安装包的三种方式
JPype安装包和文档可以通过官方github 或者官方PyPi获取。
调用示例
java -jar
import os
import subprocess
import jpype
import time
def query_by_java_jar(jar_path, param):
execute = "java -jar {} '{}'".format(jar_path, param)
# print(execute)
output = subprocess.Popen(execute, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
res = output.stdout.readlines()
return res
JPype
import os
import subprocess
import jpype
import time
def query_by_jpype(jar_path, some_param):
if not jpype.isJVMStarted():
jpype.startJVM(classpath=[jar_path])
if not jpype.isThreadAttachedToJVM():
jpype.attachThreadToJVM()
try:
java_class = jpype.JClass('com.xxx.xxx')
result = java_class.someStaticFunction(some_param)
except Exception as e:
print(e)
result = None
finally:
#jpype.shutdownJVM()
return result
再多说一点
关于JPype
具体的使用场景和方法,可参考Github里的UserGuide
shutdown之后再start报错:OSError: JVM cannot be restarted
这是JPype的一个使用限制,为防止内存泄漏的,同一进程内关闭JVM后无法再次启动。
可考虑将调用方法写入到一个Python脚本,然后通过subprocess去调用。
官方解释此处也在贴一下:
JPype Known limitations
Restarting the JVM
JPype caches many resources to the JVM. Those resource are still allocated after the JVM is shutdown as there are still Python objects that point to those resources. If the JVM is restarted, those stale Python objects will be in a broken state and the new JVM instance will obtain the references to these resulting in a memory leak. Thus it is not possible to start the JVM after it has been shut down with the current implementation.
来源:https://blog.csdn.net/u012386109/article/details/120156736


猜你喜欢
- 前沿小补充例3.48 查询平均成绩大于等于80分的学生学号和平均成绩SELECT Sno,AVG(Grade)FROM SCWHERE AV
- python启用多线程后,调用exit出现无法退出的情况,原因是exit会抛出Systemexit的异常,如果在exit外围调用了try,就
- 用于模式匹配的String方法:String支持4种使用正则表达式的方法:seach()用于检索,参数是一个正则表达式,返回第一个与之匹配的
- 创作思路:主要还是想尝试做点稍微不同于整天为迎合客户而做的东西.然后闲时就开始构思,比如坐车,走路什么的.看到有一些复古手机的相关图,就想到
- 主要要文件有:Index.html 实现功能,一个文本框,输入内容并实现提示 search.asp 查询功能,让文本框输入的内容在
- 写在前面在一些接口请求的场景中,我们希望携带的数据不希望是以明文的方式提交的,也就是需要对参数做一些混淆或者加密处理,后端拿到数据后再进行解
- 1、静态网页与动态比较: 1)静态网页: 优势:A、 对搜索引擎友好,被收录的质量高;B、访问速度快;C、资源(cpu 等)占用少。 劣势:
- requests是一个python 轻量的http客户端库,相比python的标准库要优雅很多。接下来通过本文给大家介绍Python3使用r
- 1 abstract验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情
- 简要讨论为什么它不提供++作为运算符 正常情况下,当有人问起++原因而不是Python中的运算符时,这一行引起了我的注意。如果您想知道最初的
- 可视化包Pygal生成可缩放矢量图形文件可以在尺寸不同的屏幕上自动缩放,显示图表#安装pygalpip install pygal'
- 我们在编写Python爬虫时,有时会遇到网站拒绝访问等反爬手段,比如这么我们想爬取蚂蚁短租数据,它则会提示“当前访问疑似黑客攻击,已被网站管
- 本文实例讲述了PHP判断密码强度的方法。分享给大家供大家参考,具体如下:一、php页面$score = 0;if(!empty($_GET[
- 描述tan() 返回x弧度的正弦值。语法以下是 tan() 方法的语法:import mathmath.tan(x)注意:tan()是不能直
- 1.定义在某些情况下,一个类的对象是有限且固定的,比如季节类,它只有 4 个对象;再比如行星类,目前只有 8 个对象。这种实例有限且固定的类
- 很多时候,查看一个文件夹下的每个文件大小可以轻易的做到,因为文件后面就是文件尺寸,但是如果需要查看一个文件夹下面所有的文件夹对应的尺寸,就发
- select to_char(date_published, 'yyyymm') yo from blog group by
- 权限级别划分如下:①、院长和财务科长:不能输入,可以无限制查询、统计;②、副院长:不能输入,可以查询、统计其分管部门的帐务;③、部门领导:不
- 客户端程序编写免不了经常接触XMLHttpRequest对象。微软的XHR实现的progid又是一串一串的。 烦人。抽一个中午时间,找了找资
- vue3使用computed获取vuex里数据不再是vue2.0里什么mapGetter,mapState那些复杂的获取方式,vue3.0里