java通过命令行调用python通过socket传参异常

在Java程序中使用Runtime.getRuntime().exec()调用Python脚本时遇到问题,当参数长度超过命令行限制,改用socket传递参数。然而,通过socket读取Python脚本的输出流时,Java程序无法正确读取最后几行数据。添加对命令行输出的读取代码后问题解决。此问题涉及到进程间通信和流的读取管理。
摘要由CSDN通过智能技术生成

为了方便灵活的做数据转换,决定用python写数据转换的方法,java通过Runtime.getRuntime().exec()调用python,因为参数的长度可能超过命令行的命令长度限制,不得已使用socket传参。

在调试过程中发现,如果分开调试python不使用java唤起而用命令行直接启动那么程序执行没有问题,如果使用java的Runtime.getRuntime().exec()唤起python,那么java读取socket输入流就会有问题,最后的几行数据始终读不到。

java程序如下

String[] arguments = new String[]{"python", scriptPath, o.toString()};
log.debug("脚本执行参数:{}", Arrays.asList(arguments));
runtime = Runtime.getRuntime();
process = runtime.exec(arguments);
Boolean re = process.waitFor(5, TimeUnit.SECONDS);
if (re) {
   log.debug("the subprocess has exited");
   if (process.exitValue() == 0) {
      log.info("python执行完毕");
   } else {
      log.error("python执行失败:{}", process.exitValue());
      throw new ServiceException("执行失败", -1);
   }
} else {
   log.debug("the subprocess has not exited");
}

后来发现如果加上对命令行输出读取代码后就正常了。。。百思不得其解

    String[] arguments = new String[]{"python", scriptPath, o.toString()};
                    log.debug("脚本执行参数:{}",Arrays.asList(arguments));
    runtime =Runtime.getRuntime();
    process =runtime.exec(arguments);
    process_read_thread_pool.execute(new 
    Runnable() {
        @Override
        public void run () {
            try {
                //读流
                readProcessStream(process.getInputStream(), charset, "脚本输出");
            } catch (IOException e) {
                log.error(e.getMessage(), e);
            }
        }
    });

    process_read_thread_pool.execute(new 
    Runnable() {
        @Override
        public void run () {
            try {
                读流
                readProcessStream(process.getErrorStream(), charset, "ERROR输出");
            } catch (IOException e) {
                log.error(e.getMessage(), e);
            }
        }
    });


    //                    返回值为1表示调用python脚本失败,这和我们通常意义上见到的0与1定义正好相反
    Boolean re = process.waitFor(5, TimeUnit.SECONDS);
    if(re) {
        log.debug("the subprocess has exited");
        if (process.exitValue() == 0) {
            log.info("python执行完毕");
        } else {
            log.error("python执行失败:{}", process.exitValue());
            throw new ServiceException("执行失败", -1);
        }
    } else {
        log.debug("the subprocess has not exited");
    }
private void readProcessStream(InputStream inputStream, String charset, String type) throws IOException {
        try (InputStreamReader isr = new InputStreamReader(inputStream, charset);
             BufferedReader br = new BufferedReader(isr);) {
            String line;
            while ((line = br.readLine()) != null) {
//                log.debug("{}输出:{}", type, line);
            }
        } finally {
            log.debug("退出脚本{}",type);
            inputStream.close();
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值