【问题标题】:BufferedReader - Entire output gets printedBufferedReader - 打印整个输出
【发布时间】:2014-04-19 18:56:55
【问题描述】:

我正在尝试用 Java 打印 python 文件的输出。

python 文件基本上是一个网络爬虫——其中有多个函数,每个函数都包含一些输出行。所以输出应该是一个接一个的顺序。每行输出必须以固定间隔(根据代码)出现,而不是全部在一起。 下面的代码打印输出,但我只在整个程序运行后才将输出作为单个文本获得。

public class Samtest extends Thread {

public static void main(String[] args) {

  String pythonScriptPath0 = "IR_Component_module11.py";
  String[] cmd0 = new String[2];
  cmd0[0] = "C:\\Python27\\python.exe";
  cmd0[1] = pythonScriptPath0;
  Runtime rt0 = Runtime.getRuntime();
  java.lang.Process pr0 = rt0.exec(cmd0);
  BufferedReader bfr0 = new BufferedReader(new InputStreamReader(pr0.getInputStream()));
  String line0 = "";
  while((line0 = bfr0.readLine()) != null)
  {
    System.out.println(line0);
  }

 }
}

我需要根据程序运行自然地输出。但是我在程序运行后得到了整个输出。刮板由一个 GUI 组成。所以只有当我退出 GUI 时,我才能得到输出。

【问题讨论】:

    标签: java python


    【解决方案1】:

    编辑

    Python 缓冲输出。使用-u

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Samtest extends Thread {
    
        public static void main(String[] args) throws IOException {
    
            String pythonScriptPath0 = "IR_Component_module11.py";
            String[] cmd0 = new String[3];
            cmd0[0] = "C:\\Python27\\python.exe";
            cmd0[1] = "-u";
            cmd0[2] = pythonScriptPath0;
            Runtime rt0 = Runtime.getRuntime();
            java.lang.Process pr0 = rt0.exec(cmd0);
            BufferedReader bfr0 = new BufferedReader(new InputStreamReader(pr0.getInputStream()));
            String line0 = "";
            while ((line0 = bfr0.readLine()) != null) {
                System.out.println(line0);
            }
    
        }
    }
    

    【讨论】:

    • 线程没有帮助。 java 程序仍将等待 python 脚本完成其执行。尝试执行我在答案中提供的 python 脚本。输出将完全出现,而不是先打印“Hello”并等待 2 秒,然后再打印“TimeUp”。
    • @pss 对不起 - 你是对的。它是python的输出缓冲区。我已经更改了代码。感谢您的代码审查
    • @drkunibar 使用 -u 可以解决问题!谢谢!
    【解决方案2】:

    你收到的输出是由 python 脚本创建/生成的,然后这个输出被传递给你的 java 程序,最后打印它。如果 python 脚本尚未完成执行,您将无法接收其输出。因此,您的 java 程序等待 python 脚本完成其执行,然后它从您的 python 脚本中检索输出并最终打印它。这就是关闭 GUI 时得到输出的原因。

    用一个简单的 python 脚本试试。创建一个python脚本,内容如下:

    import time
    print 'Hello'
    time.sleep(2)
    print 'TimeUp'
    

    如果您使用 python 执行此脚本,那么您可能会看到它首先打印Hello,然后在2 秒后打印TimeUp。但是当您使用您的 java 程序执行相同的脚本时。您将完全看到整个输出。因为你的java程序会等待python脚本完成。我希望你现在明白原因了。 使用线程并不能解决这个问题

    您的情况下的执行顺序是:python-script -----> Java-programme -----> Console-output

    Here 是一个有趣的问题,可能会对您有所帮助。

    【讨论】:

    • 感谢您的详细回复!我理解输出汇集在一起​​的原因!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2015-03-02
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多