这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
使用java调用python脚本返回值异常的问题
前文
本文主要为java调用python脚本时遇到的一次返回值异常的问题,在此作为记录,解决方案仅为临时方案,实际本质还需要后续进行探索。
问题描述
最近在处理一个需求,就是调用第三方代码库进行模型转换。模型转换库为第三方公司提供,库的语言为c++语言,同时对方仅提供了python脚本调用库的方案。由于项目后台是采用java作为开发主语言,因此采用java调用python脚本的方式实现模型转换。而转换中发现有时java收到的脚本返回值与预期返回值不一致。
解决思路分析
面对这个问题,目的是要获取来自python脚本打印返回的内容。经过分析得知,出现异常的打印主要是出现了c++的打印信息,而且一旦c++结果打印,python信息便无法返回给java端。 异常的打印如下:
目的需求的打印如下:
而调用python的java代码如下:
String[] arguments = new String[] {ConstData.pythonCmd, ConstData.scriptUrl,type, filepath, ConstData.outPath + outFileName};
Process process = Runtime.getRuntime().exec(arguments);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),
"GBK"));
String line = null;
String lineNew = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
lineNew = line;
}
stringBuilder.append(lineNew);
in.close();
int re = process.waitFor();
if(0 == re && "1".equals(stringBuilder.toString())){
result = ConstData.outUrl + outFileName;
}
如上所示,我们需要python脚本返回最后返回1,而如果返回c++内容则无法确认转换成功。经过测试发现,如果在执行c++脚本前,在python脚本中进行打印输出,python的结果会被输出到java中。反之,c++的结果会被输入到java中。因此只要在c++调用前通过python进行print输出即可在Java中得到目标结果。
问题分析结论
这种特殊现象暂时未找到根本原因,怀疑是python的打印与c++的打印处于不同的进程中,因此产生互相的冲突。一旦开启返回进程便指定了对应的进程。但目前并不确定是否是这个原因。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。