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 中的divmod数字处理函数浅析
Oct 17 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
Python numpy 提取矩阵的某一行或某一列的实例
Apr 03 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
Python列表生成式与生成器操作示例
Aug 01 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
python实现大学人员管理系统
Oct 25 Python
Python通过4种方式实现进程数据通信
Mar 12 Python
Python自动化办公Excel模块openpyxl原理及用法解析
Nov 05 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 29 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 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
mysql 性能的检查和优化方法
2009/06/21 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
js闭包实例汇总
2014/11/09 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
js调用设备摄像头的方法
2018/07/19 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
深入Python函数编程的一些特性
2015/04/13 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
python实现逻辑回归的示例
2020/10/09 Python
电大自我鉴定
2013/10/27 职场文书
晚宴邀请函范文
2014/01/15 职场文书
师范毕业生自我鉴定
2014/01/15 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
重阳节标语大全
2014/10/07 职场文书
幼儿学前班评语
2014/12/29 职场文书
秦兵马俑导游词
2015/02/02 职场文书
入党培养人考察意见
2015/06/08 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python