如何从java调用python脚本并返回长文本?

2024-04-26 05:18:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从Java应用程序调用python脚本并返回大文本(json响应)。我成功地调用了这个脚本,我可以向Java应用程序返回一些文本。但当我尝试返回完整的json响应时,我的Java应用程序冻结,什么也没有发生。 我如何调用python脚本:

ProcessBuilder pb = new ProcessBuilder(
    "python", absolutePath, params
);
Process ps = pb.start();

BufferedReader reader = new BufferedReader(
    new InputStreamReader(ps.getInputStream())
);

ps.waitFor();
int ec = ps.exitValue();
StringBuffer HTTPResponse = new StringBuffer();
String inputLine;

while ((inputLine = reader.readLine()) != null) {
        logger.debug(String.format("DEBUG!!!: input = %s", inputLine));
        HTTPResponse.append(inputLine);
}

Tags: 文本脚本json应用程序newstringjavareader
1条回答
网友
1楼 · 发布于 2024-04-26 05:18:18

父进程和子进程之间出现死锁。在

这是因为在子进程终止之前,java应用程序不会从子进程中读取任何内容。Python将缓冲它的输出(在我的系统中高达64k),一旦缓冲区被填满,它将在下一次写入时阻塞。因为它被阻止了,它不会终止。同时,java父进程也被阻塞,等待子进程终止,这不会自然发生。在

要解决此问题,您需要重新构造Java代码,使其在处理输出之前不等待子代码终止,而是从子代码读取,直到子代码终止,如下所示:

import java.io.*;

public class TestProcess {
    public static void main(String[] args)
        throws InterruptedException, IOException
    {
       ProcessBuilder pb = new ProcessBuilder(
           "python", absolutePath, params
       );
       Process ps = pb.start();

       BufferedReader reader = new BufferedReader(
           new InputStreamReader(ps.getInputStream())
       );

       String inputLine;
       while ((inputLine = reader.readLine()) != null) {
               System.out.println(inputLine);
       }

       ps.waitFor();
       int ec = ps.exitValue();
       System.out.println("Child returned " + ec);
   }
}

您的Python脚本可以是:

^{pr2}$

这将产生1MiB的数据。在

相关问题 更多 >