【问题标题】:Save Python console output to Java variable将 Python 控制台输出保存到 Java 变量
【发布时间】:2020-12-28 17:02:13
【问题描述】:

我在将 python 脚本的输出保存到 java 变量时遇到问题。我的代码看起来像...

Python 脚本:

def main(argv):

    filepath = argv[1]
    ...
    output = results.get_forecast(14).predicted_mean.to_json()
    print(output)
    
    
if __name__ == "__main__":
    main(sys.argv)

它可以工作 - 结果被打印到控制台 - 一切都很好。

我的 Java 代码:

ProcessBuilder pb = new ProcessBuilder("python", "-u",
                "path/to/script.py", args_filepath).inheritIO();

        try {
            Process p = pb.start();

            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            StringBuilder predictionString = new StringBuilder();
            String line;

            while((line = br.readLine()) != null) {
                predictionString.append(line);
            }

            int exitCode = p.waitFor();
            System.out.println("VALUE: " + predictionString.toString());
            br.close();

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

这部分也可以工作...我的意思是它的工作方式是执行 python 的代码,将输出写入控制台,但它不会将输出字符串保存到predictionString

【问题讨论】:

  • 你认为inheritIO() 做了什么,你为什么相信? --- 你认为p.getInputStream() 在继承 I/O 时会做什么,你为什么相信? 提示: "如果子进程的标准输出已使用 ProcessBuilder.redirectOutput 重定向,那么此方法将返回 null 输入流。"

标签: java python processbuilder


【解决方案1】:

使用redirectErrorStream方法捕获output流。

ProcessBuilder pb = new ProcessBuilder("python", "-u",
                    "path/to/script.py", args_filepath)
                    .redirectErrorStream(true);

而不是

ProcessBuilder pb = new ProcessBuilder("python", "-u",
                "path/to/script.py", args_filepath).inheritIO();

【讨论】:

  • 哇 - 它有效,非常感谢!需要阅读更多相关信息
猜你喜欢
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 2022-07-15
  • 1970-01-01
  • 2015-07-21
相关资源
最近更新 更多