上一章写到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 用以调用外部参数