从Java调用Python应用程序

时间:2018-01-24 11:22:56

标签: java process command jython

我不熟悉如何使用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应用程序得到任何响应。

虽然当我通过终端运行相同的命令时,我得到多行答案。

所以我想知道问题是否与我的代码有关?我错过了在这里看到的东西阻碍了我从答案中得到多行?无论我回到多少行,我都需要答案。

2 个答案:

答案 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的  在命令中,这将确保被调用的进程'输出将流入指定的文件。然后,应用程序可以从该文件中检索数据,并在不再需要时删除它。