Python調(diào)用jar包方法實(shí)現(xiàn)過程解析
需求
最近在后臺(tái)項(xiàng)目代碼中一段自定義的AES加解密的程序在平時(shí)的測(cè)試工作中應(yīng)用頻繁。因?yàn)閷懩_本經(jīng)常會(huì)需要使用,而經(jīng)過各種嘗試,比如jpype等,都不盡如人意。最后轉(zhuǎn)換思路找到了一種好方法:
1. 將java項(xiàng)目打成jar包;
2. 設(shè)定jar包的Main-class屬性;
3. 在python中通過subprocess執(zhí)行jar包。
修改main函數(shù)打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",注意冒號(hào)后面空一格,文件最后空一行。
注意:執(zhí)行jar包就是執(zhí)行jar包的Main-class中的main函數(shù)。所以如果要在python中調(diào)用java方法并傳參的話,要在打jar包前修改Main-class中的main方法,Main-class也就是目標(biāo)java類。
在Main-class的main函數(shù)中可以設(shè)置傳參:
String data= args[0];
String key = args[1];
// 調(diào)用解密程序并打印解密結(jié)果
這里data是密文,key是密鑰。
編寫python腳本
然后對(duì)應(yīng)寫python腳本,這里設(shè)定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包的兩個(gè)傳參相對(duì)應(yīng)也設(shè)置python腳本需要傳入兩個(gè)參數(shù),第一個(gè)是待解密的數(shù)據(jù)data,第二個(gè)是解密鑰匙key。
這里我們創(chuàng)建一個(gè)文件夾aes,將aes.py和aes.jar放到該文件夾下,二者同處于aes根目錄下。
然后在當(dāng)前目錄下啟動(dòng)cmd,執(zhí)行python腳本,傳入data和key兩個(gè)參數(shù)給python腳本:
python aes.py "待解密的字符串" "密鑰"
在python腳本會(huì)將這兩個(gè)參數(shù)再傳遞給jar包并調(diào)用jar包Main-class的main函數(shù)中調(diào)用解密過程并打印解密結(jié)果。
這樣就可以在python中調(diào)用java的解密程序,從而打印出解密后的字符串了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python中將txt文件轉(zhuǎn)換為csv文件的三種方法舉例
對(duì)于大數(shù)據(jù)的處理基本都是以CSV文件為基礎(chǔ)進(jìn)行的,那么在進(jìn)行深度學(xué)習(xí)的處理之前,需要先統(tǒng)一數(shù)據(jù)文件的格式,下面這篇文章主要給大家介紹了關(guān)于python中將txt文件轉(zhuǎn)換為csv文件的三種方法,需要的朋友可以參考下2024-06-06Python數(shù)據(jù)可視化之基于pyecharts實(shí)現(xiàn)的地理圖表的繪制
今天給大家?guī)淼氖荘ython的相關(guān)知識(shí),文章圍繞著pyecharts繪制地理圖表展開,文中有非常詳細(xì)的代碼示例及介紹,需要的朋友可以參考下2021-06-06python 使用三引號(hào)時(shí)容易犯的小錯(cuò)誤
這篇文章主要介紹了python 使用三引號(hào)時(shí)容易犯的小錯(cuò)誤,幫助新手學(xué)習(xí),避免入坑,感興趣的朋友可以了解下2020-10-10Django 拼接兩個(gè)queryset 或是兩個(gè)不可以相加的對(duì)象實(shí)例
這篇文章主要介紹了Django 拼接兩個(gè)queryset 或是兩個(gè)不可以相加的對(duì)象實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03基于Python實(shí)現(xiàn)批量讀取大量nc格式文件并導(dǎo)出全部時(shí)間信息
這篇文章主要為大家詳細(xì)介紹了如何基于Python語言,逐一讀取大量.nc格式的多時(shí)相柵格文件并導(dǎo)出其中所具有的全部時(shí)間信息的方法,需要的可以參考下2024-01-01