上一章寫到Java 調用 Python 方法學習的三種方法,這里強調第三種方法。第三種方法本質上和第二種方法是一樣的,都是應用到
Runtime.getRuntime().exec()?去執行文件。要深度理解這種方法,首先要先理解一下Runtime.getRuntime().exec() 。
Runtime.getRuntime().exec():
Runtime.getRuntime().exec()方法主要用于執行外部的程序或命令。
Runtime.getRuntime().exec共有六個重載方法:
public Process exec(String command)
//在單獨的進程中執行指定的字符串命令。
public Process exec(String [] cmdArray)
//在單獨的進程中執行指定命令和變量
public Process exec(String command, String [] envp)
//在指定環境的獨立進程中執行指定命令和變量
public Process exec(String [] cmdArray, String [] envp)
//在指定環境的獨立進程中執行指定的命令和變量
public Process exec(String command,String[] envp,File dir)
//在有指定環境和工作目錄的獨立進程中執行指定的字符串命令
public Process exec(String[] cmdarray,String[] envp,File dir)
//在指定環境和工作目錄的獨立進程中執行指定的命令和變量
參數說明:
cmdarray
?- 包含所調用命令及其參數的數組。
envp
?- 字符串數組,其中每個元素的環境變量的設置格式為?name=value,如果子進程應該繼承當前進程的環境,或該參數為 null。
dir
?- 子進程的工作目錄;如果子進程應該繼承當前進程的工作目錄,則該參數為 null。(以上來源鏈接)
關于Runtime.getRuntime().exec()的具體用法就不做贅述,各大blog或者論壇以及官方文檔中都有詳細介紹,具體要理解一下Runtime.getRuntime().exec()的工作原理,方便使用以及調試。
Runtime.getRuntime().exec()的工作原理:
Runtime.getRuntime().exec()就是調用服務器命令腳本來執行指定命令,所以它的執行是基于使用者電腦本身(因此在調用有第三方庫的程序時要確保電腦本身已經具有這些第三方環境)。其執行過程有點類似系統的命令行操作,所以在調試過程中可以先利用命令行操作進行參數調試,然后在確定執行命令的書寫(主要是個人喜歡這中調試方式,而且在用Runtime.getRuntime().exec()執行python文件時,有時候python中有錯卻不會在java中傳遞相應的錯誤信息)
這里因為我電腦中有多個版本的python,所以指定python36。在系統命令操作中調試成功,確保被調用的文件沒有問題再在java中調用
?
String[] args = new String[] { "python36", "D://demo2.py", parameters};
Process proc = Runtime.getRuntime().exec(args);
準備:
1.基于python的深度學習模型
2.基于java的Springboot項目
?
?首先前端頁面中通過ajax請求調用后端的相應函數并完成指定操作:
htmlobj = $.ajax({url: "/目標類/目標方法?指定參數,async: false});
接著在action中寫相應的響應操作
@RestController
@RequestMapping("/目標類")
public class BikeAction {//獲取診斷信息@RequestMapping("/目標方法")@ResponseBodypublic ResResponseBody getDiagnoseInfoList(BikeInfoV bikeInfoV) {函數體內容}
}
函數體內容
//從數據庫中獲取數據并用實體類封裝
ArrayList<diagnoseInfo> diagnoseInfolist = bikeService.getDiagnoseInfoList(bikeInfoV);
//定義responseBody類為了以json封裝返回結果病返回給前端
ResResponseBody responseBody = new ResResponseBody();//將實體類轉換為json類,為了方便轉化為string類并以參數傳到python文件中
ObjectMapper om = new ObjectMapper();
try {str = om.writeValueAsString(diagnoseInfolist);//將實體類轉換為json類
} catch (JsonProcessingException e) {e.printStackTrace();
}//利用Runtime.getRuntime().exec調用python文件,注意eclipse中的文件目錄是以項目目錄為根目錄的,所以在調用的時候可以使用絕對路徑,也可以利用相對路徑
try {String[] args = new String[] { "python36","src\\python\\SAE\\demo2.py", str };Process proc = Runtime.getRuntime().exec(args);// 執行py文件//遠離同cmd執行一樣BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(),"gb2312"));while ((line = in.readLine()) != null) {responseBody.setLine(line);}in.close();proc.waitFor();
} catch (IOException e) {e.printStackTrace();
} catch (InterruptedException e) {e.printStackTrace();
} //返回信息給前端
return responseBody;
利用Runtime.getRuntime().exec調用python文件,注意eclipse中的文件目錄是以項目目錄為根目錄的,所以在調用的時候可以使用絕對路徑,也可以利用相對路徑具體見路徑
在python文件中
import sys? ?用以調用外部參數???????