Python调用jar包方法实现过程解析


Posted in Python onAugust 11, 2020

需求

最近在后台项目代码中一段自定义的AES加解密的程序在平时的测试工作中应用频繁。因为写脚本经常会需要使用,而经过各种尝试,比如jpype等,都不尽如人意。最后转换思路找到了一种好方法:

1. 将java项目打成jar包;

2. 设定jar包的Main-class属性;

3. 在python中通过subprocess执行jar包。

修改main函数打jar包

在intellij中打jar包:

1. File--> Project Structure... --> Artifacts --> + --> JAR --> From modules with dependencies --> OK --> 勾选Include in project build --> 记录上方Output directory路径 --> OK;

2. Build --> Build Project --> 之后就可以在Output directory路径看到打的jar包了;

3. 用WinRAR打开jar包,修改其中META-INF文件夹下的MANIFEST.MF文件,增加一行Main-class入口,例如:"Main-class: com.package.name.Classname",注意冒号后面空一格,文件最后空一行。

注意:执行jar包就是执行jar包的Main-class中的main函数。所以如果要在python中调用java方法并传参的话,要在打jar包前修改Main-class中的main方法,Main-class也就是目标java类。

在Main-class的main函数中可以设置传参:

String data= args[0];
String key = args[1];
// 调用解密程序并打印解密结果

这里data是密文,key是密钥。

编写python脚本

然后对应写python脚本,这里设定python文件名为aes.py,假定我们用来解密的jar包名为aes.jar:

import subprocess
import chardet
import sys

class AES(object):
  def __init__(self, data, key):
    self.data = data
    self.key = key

  def decrypt(self):    
    command = "java -jar aes.jar"
    arg0 = self.data
    arg1 = self.key
    cmd = [command,arg0,arg1]
    new_cmd = " ".join(cmd)
    stdout,stderr = subprocess.Popen(new_cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()
    encoding = chardet.detect(stdout)["encoding"]
    result = stdout.decode(encoding)
    return result

if __name__ == '__main__':
  data = sys.argv[1]
  key = sys.argv[2]
  AES = AES(data,key)
  print(AES.decrypt())

这里为了与jar包的两个传参相对应也设置python脚本需要传入两个参数,第一个是待解密的数据data,第二个是解密钥匙key。

这里我们创建一个文件夹aes,将aes.py和aes.jar放到该文件夹下,二者同处于aes根目录下。

然后在当前目录下启动cmd,执行python脚本,传入data和key两个参数给python脚本:

python aes.py "待解密的字符串" "密钥"

在python脚本会将这两个参数再传递给jar包并调用jar包Main-class的main函数中调用解密过程并打印解密结果。

这样就可以在python中调用java的解密程序,从而打印出解密后的字符串了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python发送以整个文件夹的内容为附件的邮件的教程
May 06 Python
Python 3.x 新特性及10大变化
Jun 12 Python
Python requests发送post请求的一些疑点
May 20 Python
python 输入一个数n,求n个数求乘或求和的实例
Nov 13 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
Python标准库使用OrderedDict类的实例讲解
Feb 14 Python
Kears+Opencv实现简单人脸识别
Aug 28 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
Python实现名片管理系统
Feb 14 Python
python判断两个序列的成员是否一样的实例代码
Mar 01 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 Python
分享3个非常实用的 Python 模块
Mar 03 Python
如何用python免费看美剧
Aug 11 #Python
Pythonic版二分查找实现过程原理解析
Aug 11 #Python
Python3合并两个有序数组代码实例
Aug 11 #Python
Python基于gevent实现文件字符串查找器
Aug 11 #Python
Python3如何实现Win10桌面自动切换
Aug 11 #Python
Python3如何使用多线程升程序运行速度
Aug 11 #Python
使用Python pip怎么升级pip
Aug 11 #Python
You might like
PHP常用代码大全(新手入门必备)
2010/06/29 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
简单通用的JS滑动门代码
2008/12/19 Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
2015/02/03 Javascript
javascript函数式编程实例分析
2015/04/25 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
Less 安装及基本用法
2018/05/05 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
发布你的Python模块详解
2016/09/15 Python
快速查询Python文档方法分享
2017/12/27 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
2020/02/18 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
python drf各类组件的用法和作用
2021/01/12 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
大型晚会策划方案
2014/02/06 职场文书
法学函授自我鉴定
2014/02/06 职场文书
工作迟到检讨书
2014/02/21 职场文书
安全责任书范文
2014/03/12 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
计划生育证明书写要求
2014/09/17 职场文书
2014年教师教学工作总结
2014/11/08 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
2014年度工作总结报告
2014/12/15 职场文书
顶岗实习协议书
2015/01/29 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书