我不熟悉如何使用Jython从我的Java(Spring Boot)应用程序调用Python应用程序,所以我通常使用以下方法从python应用程序中检索json响应:(Java应用程序在CentOS7环境中运行)
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec("python test.py");
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
log.debug(line + "\n");
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
当我调用任何python应用程序时,这很有用,它只返回一行,例如 {“status”:“ok”}
但是如果它让我回到多行,或者在给我回到json答案之后的异常,我希望,我的Java应用程序返回一个空字符串,就好像它不会从Python应用程序得到任何响应。
虽然当我通过终端运行相同的命令时,我得到多行答案。
所以我想知道问题是否与我的代码有关?我错过了在这里看到的东西阻碍了我从答案中得到多行?无论我回到多少行,我都需要答案。
答案 0 :(得分:0)
你的方法一般与Jython或Python无关。您刚刚开始一个新的过程并阅读其标准输出。 只是在你的情况下,这是一个python应用程序,输出应该是json(但可能是任何东西)。
如果我理解正确,你只想接受"你的python进程输出一行json。试试这个:
public String getOutputFromProcess() {
//Use StringBuilder instead of Buffer if you dont need the thread safety
StringBuilder output = new StringBuilder();
StringBuilder error = new StringBuilder();
//Removed error handling for simplicity
Process p = Runtime.getRuntime().exec("python test.py");
p.waitFor(); //Maybe this needs to be moved after the reading part
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
//You also need to read the standard error output
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = "";
int counter = 0;
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
counter++;
}
while ((line = stdError.readLine()) != null) {
error.append(line + "\n");
}
//Check if we have read more than one line
//If yes return empty string or null etc.
if(counter > 1) return "";
//Here you should check if this is a valid json string
return output.toString();
}
一般情况下,我建议您查看Jython并直接调用python函数。如果您想使用您的方法,请查看ProcessBuilder
。
答案 1 :(得分:0)
显然,我的解决方案是创建一个shell脚本,作为Java和Python应用程序之间的桥梁。 出于某种原因,我想使用的这个python应用程序只有在有多行时才会返回任何答案。
对此有几种解决方法,可能最好的是Jython,正如@HectorLector建议的那样。
当我创建调用Python应用程序的shell脚本时,它也可以工作,我的Java应用程序调用shell脚本而不是Python文件。
另一种解决方案是使用额外的>运行命令。 output.txt的 在命令中,这将确保被调用的进程'输出将流入指定的文件。然后,应用程序可以从该文件中检索数据,并在不再需要时删除它。