java 如何調用Python文件包括傳參
最近在和我的小伙伴們做一個物體識別的小程序,主要是他通過深度學習,然后訓練出了一個模型,只要向模型傳圖片的路徑,即可得到識別的結果,
然后我主要負責做服務器和通過java調用他的模型,簡單的說就是在java環(huán)境下調用Python腳本,
主要有兩個方式
第一個是通過jython,這個方法不太好用,當Python用到第三方庫的時候,由于jython不可能涵蓋所有python第三方類庫,
所以建議用第二種Runtime.getRuntime()開啟進程來執(zhí)行python腳本文件
String[] arguments = new String[] {"python","D:\\ccc\\1.py",str};//指定命令、路徑、傳遞的參數
try {
Writer out = response.getWriter(); //獲得HttpServletResponse輸出流對象
Process process = Runtime.getRuntime().exec(arguments);//開啟進程來執(zhí)行腳本文件
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));//獲取字符輸入流對象
String line = null;
while ((line = in.readLine()) != null) {
JSONArray Resulet = JSONArray.fromObject(util.DataHandle(line.toString()));//讀取到結果(一行文字)進行數據處理
String json = Resulet.toString();
out.write(json);//使用輸出流對象向小程序發(fā)送字符數據
}
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
第一行代碼傳遞的參數str就是圖片的路徑(我這實例代碼只傳遞一個參數,如果傳遞多個參數直接在str,后面加,格式都是一樣,Python代碼接收參數也是不一樣,接著往下看),剩下的代碼我都上了注釋
from keras.models import load_model
import numpy as np
from keras.preprocessing import image
import sys
import re
def 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.0
pre_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_y
prediction=predict(sys.argv[1])
print(prediction)
上面是Python代碼,prediction=predict(sys.argv[1])代碼里面的sys.argv[1]就是接收傳遞過來的參數str,如果多個參數就以此類推接收

小程序接收到數據并輸出到控制臺

然后就是顯示數據,給我小伙伴的深度學習點個贊!準確率還是挺高的
補充:Java調用Python文件
有時候我們想要通過java調用一個python文件,而這個python文件又必須在特定的virtualenv虛擬環(huán)境下才能運行。如果直接將這個python文件所需要的包安裝到python系統(tǒng)環(huán)境下難免有些暴力
我想到了如下方法解決這個問題:
創(chuàng)建虛擬環(huán)境后,如果虛擬環(huán)境的文件夾叫做env,我們平時激活虛擬環(huán)境的命令是 source env/bin/activate 。在bin目錄中還有一個文件叫做activate_this.py,我們通過這個文件切換到虛擬環(huán)境,在一個python文件(假設叫a.py)中調用該文件(activate_this.py),再書寫想要調用的目標python文件,再由Java調用a.py即可完成指定虛擬環(huán)境下的python文件調用。
python文件名為a.py,代碼如下
import os
activate_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();
}
}
}
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關文章
spring boot @ResponseBody轉換JSON 時 Date 類型處理方法【兩種方法】
這篇文章主要介紹了spring boot @ResponseBody轉換JSON 時 Date 類型處理方法,主要給大家介紹Jackson和FastJson兩種方式,每一種方法給大家介紹的都非常詳細,需要的朋友可以參考下2018-08-08
java 使用HttpURLConnection發(fā)送數據簡單實例
這篇文章主要介紹了java 使用HttpURLConnection發(fā)送數據簡單實例的相關資料,需要的朋友可以參考下2017-06-06
Java中l(wèi)ogback?自動刷新不生效的問題解決
本文主要介紹了Java中l(wèi)ogback?自動刷新不生效的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05

