Java程序中调用python脚本实现
核心是使用Runtime.getRuntime()实现
因本人最近的系统项目需要调用到python,遂看了下有哪些实现方式,最终敲定使用本文的方法实现对python脚本的调用。本文方法在调试时遇到的坑比较多,因为是直接调用脚本,所以调用失败时报错并不友好。
直接上代码。
public static boolean modelPredict(String dataPath, String model, String xName, String yName, double ma, double high, double theta, double alpha) throws IOException {
int flag = -1024;
String file = dataPath;
String pyPath = "./src/main/resources/static/python/myModel/model_predict.py";
String modelPath = model;
String cmd = "D:\\program_02\\Anaconda\\envs\\openmdao\\python.exe " + pyPath + " " + file + " " + modelPath + " " + xName + " " + yName;
String[] params = new String[]{String.valueOf(ma), String.valueOf(high), String.valueOf(theta), String.valueOf(alpha)};
for (String param : params) {
cmd += " ";
cmd += param;
}
Process proc;
try {
proc = Runtime.getRuntime().exec(cmd); // 关键语句
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); // 读取python控制台的输出流
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
flag = proc.waitFor();
System.out.println(flag);
} catch (InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
return flag > 0 ? false : true; // 判断程序是否执行成功,0表示成功,1及以上表示失败,具体失败原因可参考下面链接
}
python代码
if __name__ == "__main__":
data_path = sys.argv[1] # 实际接收的参数注意是从第一个开始,
model_path = sys.argv[2]
x_name = sys.argv[3]
y_name = sys.argv[4]
实际需要注意的是:
"D:\program_02\Anaconda\envs\openmdao\python.exe " 为python的运行环境可以根据本机调配好的环境进行更改。每个参数间用空格分开。
运行报错代码一般可以参考Process.waitFor()方法的返回值