java 如何調(diào)用Python文件包括傳參
最近在和我的小伙伴們做一個(gè)物體識(shí)別的小程序,主要是他通過(guò)深度學(xué)習(xí),然后訓(xùn)練出了一個(gè)模型,只要向模型傳圖片的路徑,即可得到識(shí)別的結(jié)果,
然后我主要負(fù)責(zé)做服務(wù)器和通過(guò)java調(diào)用他的模型,簡(jiǎn)單的說(shuō)就是在java環(huán)境下調(diào)用Python腳本,
主要有兩個(gè)方式第一個(gè)是通過(guò)jython,這個(gè)方法不太好用,當(dāng)Python用到第三方庫(kù)的時(shí)候,由于jython不可能涵蓋所有python第三方類庫(kù),
所以建議用第二種Runtime.getRuntime()開(kāi)啟進(jìn)程來(lái)執(zhí)行python腳本文件
String[] arguments = new String[] {'python','D:ccc1.py',str};//指定命令、路徑、傳遞的參數(shù)try { Writer out = response.getWriter(); //獲得HttpServletResponse輸出流對(duì)象 Process process = Runtime.getRuntime().exec(arguments);//開(kāi)啟進(jìn)程來(lái)執(zhí)行腳本文件 BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));//獲取字符輸入流對(duì)象 String line = null; while ((line = in.readLine()) != null) {JSONArray Resulet = JSONArray.fromObject(util.DataHandle(line.toString()));//讀取到結(jié)果(一行文字)進(jìn)行數(shù)據(jù)處理 String json = Resulet.toString(); out.write(json);//使用輸出流對(duì)象向小程序發(fā)送字符數(shù)據(jù) } out.close(); in.close(); } catch (Exception e) { e.printStackTrace();}
第一行代碼傳遞的參數(shù)str就是圖片的路徑(我這實(shí)例代碼只傳遞一個(gè)參數(shù),如果傳遞多個(gè)參數(shù)直接在str,后面加,格式都是一樣,Python代碼接收參數(shù)也是不一樣,接著往下看),剩下的代碼我都上了注釋
from keras.models import load_modelimport numpy as npfrom keras.preprocessing import imageimport sysimport redef predict(pic_dir): model = load_model('D:/ccc/model.h5') images = image.load_img(pic_dir, target_size=(32,32)) images = image.img_to_array(images) images = np.expand_dims(images, axis=0) images=np.array(images,dtype=int) images_normalize=images.astype('float32')/255.0pre_y=model.predict(images_normalize) pre_y=pre_y.reshape(-1) np.set_printoptions(suppress=False) pre_y=[pre_y[i]*100 for i in range(len(pre_y))] pre_y=[str(pre_y[i]) for i in range(len(pre_y))]for i in range(len(pre_y)):if pre_y[i].find(’e’,0,len(pre_y[i]))!=-1: wei=int(pre_y[i][len(pre_y[i])-1])-1 pre_y[i]=re.sub(r’e-.*$’,’’,pre_y[i]) pre_y[i]=re.sub(r’[^0-9]’,’’,pre_y[i]) for j in range(0,wei): pre_y[i]=’0’+pre_y[i] pre_y[i]=’0’+’.’+pre_y[i] pre_y=[pre_y[i]+'%' for i in range(len(pre_y))] return pre_yprediction=predict(sys.argv[1])print(prediction)
上面是Python代碼,prediction=predict(sys.argv[1])代碼里面的sys.argv[1]就是接收傳遞過(guò)來(lái)的參數(shù)str,如果多個(gè)參數(shù)就以此類推接收
小程序接收到數(shù)據(jù)并輸出到控制臺(tái)
然后就是顯示數(shù)據(jù),給我小伙伴的深度學(xué)習(xí)點(diǎn)個(gè)贊!準(zhǔn)確率還是挺高的
補(bǔ)充:Java調(diào)用Python文件
有時(shí)候我們想要通過(guò)java調(diào)用一個(gè)python文件,而這個(gè)python文件又必須在特定的virtualenv虛擬環(huán)境下才能運(yùn)行。如果直接將這個(gè)python文件所需要的包安裝到python系統(tǒng)環(huán)境下難免有些暴力
我想到了如下方法解決這個(gè)問(wèn)題:創(chuàng)建虛擬環(huán)境后,如果虛擬環(huán)境的文件夾叫做env,我們平時(shí)激活虛擬環(huán)境的命令是 source env/bin/activate 。在bin目錄中還有一個(gè)文件叫做activate_this.py,我們通過(guò)這個(gè)文件切換到虛擬環(huán)境,在一個(gè)python文件(假設(shè)叫a.py)中調(diào)用該文件(activate_this.py),再書(shū)寫想要調(diào)用的目標(biāo)python文件,再由Java調(diào)用a.py即可完成指定虛擬環(huán)境下的python文件調(diào)用。
python文件名為a.py,代碼如下
import osactivate_this = ’path/to/activate_this.py’execfile(activate_this, dict(__file__=activate_this))os.system('python target.py')
java代碼
import java.io.BufferedReader;import java.io.InputStreamReader; public class Test { public static void main(String[] args) { try { System.out.println('start'); Process pr = Runtime.getRuntime().exec('python /home/kui/桌面/a.py'); BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); String line; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); pr.waitFor(); System.out.println('end'); } catch (Exception e) { e.printStackTrace(); } }}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章:
1. Warning: require(): open_basedir restriction in effect,目錄配置open_basedir報(bào)錯(cuò)問(wèn)題分析2. ASP.NET Core 5.0中的Host.CreateDefaultBuilder執(zhí)行過(guò)程解析3. ASP調(diào)用WebService轉(zhuǎn)化成JSON數(shù)據(jù),附j(luò)son.min.asp4. SharePoint Server 2019新特性介紹5. ASP中常用的22個(gè)FSO文件操作函數(shù)整理6. React+umi+typeScript創(chuàng)建項(xiàng)目的過(guò)程7. php網(wǎng)絡(luò)安全中命令執(zhí)行漏洞的產(chǎn)生及本質(zhì)探究8. 無(wú)線標(biāo)記語(yǔ)言(WML)基礎(chǔ)之WMLScript 基礎(chǔ)第1/2頁(yè)9. 三個(gè)不常見(jiàn)的 HTML5 實(shí)用新特性簡(jiǎn)介10. php測(cè)試程序運(yùn)行速度和頁(yè)面執(zhí)行速度的代碼
