Python调用Jar包的两种方式小结

目录
  • 概览
  • 环境配置
    • 安装JDK
    • 安装JPype(如需要)
  • 调用示例
    • java -jar
    • JPype
  • 再多说一点
    • 关于JPype
  • 总结

概览

因工作场景,需要在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.

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python查找指定依赖包简介信息实现

    正文 做python项目时,想安装某个依赖包的最新版本,但又不知道它的版本号具体到多少,因此需要搜索查看它的相关简介信息. 原来的时候,可以直接通过pip搜索查看: pip search xxx. 但如今,再用这种方式会报错: pip search django ERROR: XMLRPC request failed [code: -32500] RuntimeError: PyPI no longer supports 'pip search' (or XML-RPC search). Pl

  • python打包exe文件并隐藏执行CMD命令窗口问题

    目录 python打包exe文件并隐藏执行CMD命令窗口 Python打包exe程序避坑指南:没有安装包也能运行小程序 如果有问题看下面 总结 python打包exe文件并隐藏执行CMD命令窗口 虚拟环境安装 pyinstaller pip install pyinstaller  打包exe命令:(具体的命令网上资料很多) # 打包1个py文件,并隐藏执行窗口 pyinstaller -F -w main.py    # 打包1个py文件(-F),并隐藏执行窗口(-w),替换exe的ico图标

  • idea+maven打jar包的两种方式

    两种打jar包的方法: jar包工程是maven下的quickstart工程 需要jar的是maven下的webapp工程(我这里是这样的 ) 一.普通jar包的打包方式: 在我们的idea工程界面,点击右上角的project structure 然后在project setting里面选择Artifacts,点击加号,选择jar,给个包名,然后apply 回到我们的工程界面,选择菜单栏中的build,下拉菜单中的build artifacts 如果是第一次打包就build,不是就rebuild

  • 详细总结IDEA中打jar包的两种方式

    一.前言 在讲这两种方式之前,我们先来说明一下什么是java中的jar文件 jar (Java Archive File),翻译过来就是java的档案文件,它其实也类似于我们windows下的zip文件,唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的,包含了JAR包的描述信息.主类的全类名等信息. 二.不使用Maven直接打Jar包 1.File -->Project Structure -->

  • IDEA中打jar包的两种方式

    在讲这两种方式之前,我们先来说明一下什么是java中的jar文件 jar (Java Archive File),翻译过来就是java的档案文件,它其实也类似于我们windows下的zip文件,唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的,包含了JAR包的描述信息.主类的全类名等信息. 一:不使用Maven直接打Jar包. 1.File -->Project Structure -->Arti

  • 详解idea+maven打jar包的两种方式

    两种打jar包的方法: jar包工程是maven下的quickstart工程 需要jar的是maven下的webapp工程(我这里是这样的 ) 一.普通jar包的打包方式: 在我们的idea工程界面,点击右上角的project structure 然后在project setting里面选择Artifacts,点击加号,选择jar,给个包名,然后apply 回到我们的工程界面,选择菜单栏中的build,下拉菜单中的build artifacts 如果是第一次打包就build,不是就rebuild

  • Maven打jar包的三种方式(小结)

    不包含依赖jar包 该方法打包的jar,不包含依赖的jar包,也没有指定入口类. <build> <plugins> <plugin> <!-- 指定项目编译时的java版本和编码方式 --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.

  • 超详细介绍idea中java程序打jar包的两种方式

    java程序打成的jar包有两种类型,一种是可直接执行的runnable jar文件,另一种是包含多个主类,运行时需要指定主类全类名的jar包,下面我们细说在idea中两种jar包的打包方法及执行jar包时的命令. 第一种: 含多个主类的jar包打包方法及运行命令在写好我们要打jar包的java程序后,点击idea右上角如图所示位置 先选择Artifacts,再点击加号 点击Empty新建一个新的jar包 如图,设置jar包名称,jar包打好后所在的路径,以及添加工程编译文件 点击OK后,会回到

  • Intellij IDEA 添加jar包的三种方式(小结)

    一.直接复制:(不推荐) 方法:直接将硬盘上的jar包复制粘贴到项目的lib目录下即可. 注意: 1.对于导入的eclipse项目,该方式添加的jar包没有任何反应,用make编译项目会报错 2.对于在idea中创建的项目,该方式添加jar包,编译不报错,但是打开Structure会有"...jar ... is missing ..."的提示,需要点击"Fix"或红灯泡解决. 二.通过Modules的Dependencies添加:(推荐) 1.打开 File -&

  • python连接clickhouse数据库的两种方式小结

    目录 python连接clickhouse数据库 主要针对clickhouse_driver的使用进行简要介绍 python将数据写入clickhouse python连接clickhouse数据库 在Python中获取系统信息的一个好办法是使用psutil这个第三方模块. 顾名思义,psutil = process and system utilities,它不仅可以通过一两行代码实现系统监控,还可以跨平台使用. 主要针对clickhouse_driver的使用进行简要介绍 第一步: 通过pi

  • SpringBoot分离打Jar包的两种配置方式

    目录 方式一:基于maven-jar-plugin 方式二:基于spring-boot-maven-plugin 附录:参考链接 SpringBoot分离打Jar包的两种方式 方式一:基于maven-jar-plugin 此方式基于这个小伙伴的配置改的:https://www.jb51.net/article/188606.htm 注意 这种方式打包出来的Jar基于插件提供的类加载器启动:org.springframework.boot.loader.PropertiesLauncher 所有依

  • java打jar包的几种方式详解

    一.制作只含有字节码文件的jar包 我们先来看只含有字节码文件,即只含有class文件的jar包怎么制作,这是最简单的形式 1.最简单的jar包--直接输出hello 最终生成的jar包结构 META-INF Hello.class 方法步骤 (1)用记事本写一个Hello.java的文件 class Hello{     public static void main(String[] agrs){         System.out.println("hello");     }

随机推荐