【无标题】

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()方法的返回值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值