java通过Runtime.getRuntime().exec调用python脚本解决bug总结

前提环境:
操作系统:MAC OS
Python脚本:OpenCV中最简单的图像缩放程序
java运行环境:Springboot+IDEA+jdk1.8

话不多说,直接上一开始执行代码

//测试代码
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.*;

@SpringBootTest
class LayuiApplicationTests {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Test
    void contextLoads() {
        int a = 3;
        int b = 2;
        try {
            String[] arg = new String[]{"python3", "src/main/resources/python/sizeChange.py",String.valueOf(a), String.valueOf(b)};
            Process pr = Runtime.getRuntime().exec(arg);
            final InputStream is1 = pr.getInputStream();
            new Thread(() -> {
                BufferedReader br = new BufferedReader(new InputStreamReader(is1));
                try{
                    while(br.readLine() != null) ;
                }
                catch(Exception e) {
                    e.printStackTrace();
                }
            }).start();
            InputStream is2 = pr.getErrorStream();
            BufferedReader in = new BufferedReader(new InputStreamReader(is2));
            String line = null;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }

            int re = pr.waitFor();
            in.close();
            if (re == 1) {
                logger.info("调用脚本失败");
            } else {
                logger.info("调用脚本成功");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Python脚本代码:

import cv2
import sys

def func(a,b):
    src = cv2.imread('src/main/resources/python/logo.jpg',3)
    res = cv2.resize(src, None, fx=a, fy=b, interpolation = cv2.INTER_CUBIC)
    cv2.imwrite('src/main/resources/python/res.jpg',res)

if __name__ == '__main__':
    a = []
    for i in range(1, len(sys.argv)):
        a.append((int(sys.argv[i])))
    func(a[0],a[1])

从主程序传参到Python程序中调用

起先一开始死活运行不出来图片结果,明明在终端执行python /xxx/xxx.py全路径名称都能 成功执行,到这就一直执行不出结果,后来查遍几乎所有跟Runtime.getRuntime().exec有关的资料。。问题发现了
在这里插入图片描述

由于Mac自带Python版本是Python2,即使你已经在外面把Mac版本改为3,但通过Runtime.getRuntime().exec调用Python脚本时依旧会以2为基础执行(咱也不知道为什么),导致执行错误,所以要把命令改为python3,这里的is1、is2用来解决进程阻塞执行不出结果的问题,去掉后也可以照常执行,出问题加上就好了

以下是最简洁的执行代码:

@Test
    void contextLoads() {
        int a = 3;
        int b = 2;
        try {
            String[] arg = new String[]{"python3", "src/main/resources/python/sizeChange.py",String.valueOf(a), String.valueOf(b)};
            Process pr = Runtime.getRuntime().exec(arg);
            BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            int re = pr.waitFor();
            in.close();
            if (re == 1) {
                logger.info("调用脚本失败");
            } else {
                logger.info("调用脚本成功");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

Windows估计就没那么多事了。。Mac还是要注意一下差别

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值