• Python调用jar包中的方法


    [本文出自天外归云的博客园]

    需求

    最近在后台项目代码中一段自定义的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的解密程序,从而打印出解密后的字符串了。

    参考资料

    1. IntelliJ IDEA java项目导入jar包,打jar包

    2. Java运行jar命令提示没有主清单属性

    3. 在cmd中使用指令来执行jar包

  • 相关阅读:
    8.5 exit函数进程控制
    8.2 进程标识
    8.6 wait和waitpid函数进程控制
    2.jpg
    8.3 fork函数进程控制
    8.4 vfork函数进程控制
    8.9 竞态条件
    8.8 wait3和wait4函数进程控制
    8.7 waitid函数进程控制
    Silverlight Tools 3.0中文正式版发布(附下载地址)
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/8042758.html
Copyright © 2020-2023  润新知