【问题标题】:can't acquire python output无法获取python输出
【发布时间】:2016-10-03 11:18:18
【问题描述】:

我的 python 代码在一个真正的循环中在 java 中打印,但如果我进入睡眠状态则不会打印,即使在睡眠持续时间之后,java 中也没有输出

print 33
import time

while True:
    i = 0
    time.sleep(0.01)
    j = 0
    print 1

这是python代码。我从 java 代码运行它

public class DistanceHandler extends Thread
{
    private Process p;
    private ProcessBuilder pb;
    private BufferedReader bfr;

    public DistanceHandler()
    {
        try{
            /*pb = new ProcessBuilder("python", "/home/pi/Distance.py");
            pb.redirectErrorStream(true);
            pb.
            p = pb.start();
            bfr = new BufferedReader(new InputStreamReader(p.getInputStream()));*/
            p = Runtime.getRuntime().exec("sudo python /home/pi/test.py -u");
            bfr = new BufferedReader(new InputStreamReader(p.getInputStream()));
        } catch (Exception e)  {
            System.out.println(e);
        }
    }

    public void run(){
        System.out.println("Start read");
        if(p != null) {
            System.out.println("P alive: " + p.isAlive());

            int line = 0;
            try {
                while ((line = bfr.read()) != -1) {
                //display each output line form python script
                   System.out.println((char)line);
                   if(line < 10){
                       System.out.println("Pop that Ballooon ");
                    }
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }    
}

【问题讨论】:

  • 在 print 语句后添加sys.stdout.flush() 也无济于事?
  • 谢谢,这解决了它
  • 作为解释:输出流被缓冲,即print仅在缓冲区已满或显式刷新流时才导致实际输出。对于小块输出,您的数据永远不会离开 python 进程,它会保留在流缓冲区中。 流的常见问题下的文件
  • 但是为什么你不睡觉的时候它会起作用呢?
  • 它也适用于睡眠,但需要更长的时间。当缓冲区第一次满时,您会得到输出。如果没有睡眠,您将非常快速地填充缓冲区。随着睡眠,填充缓冲区需要更多时间。

标签: java python sleep


【解决方案1】:

这是一个常见问题。 Python(和 C,就此而言)流是buffered

在您的情况下,这意味着 print 不需要立即输出,而是填充流的输出缓冲区。

程序的 Java 端只会在缓冲区满后接收一次数据(然后是完整的缓冲区,这正是缓冲区的用途:避免对小规模 IO 的系统调用)。现在,由于默认缓冲区大小通常为 8,192 字节,并且假设 print 1 为每个循环写入 2 个字节 ('1\n'),因此填充缓冲区需要 40 多秒。因此看起来 Java 程序没有得到任何输入,而实际上我们只是在等待 Python 端的输出缓冲区填满。

如果您删除sleep(),您会尽快填充缓冲区,从而导致几乎立即写入。

您可以强制流刷新缓冲区以避免此问题:

while True:
    i = 0
    time.sleep(0.01)
    j = 0
    print 1
    sys.stdout.flush()

【讨论】:

    猜你喜欢
    • 2015-05-25
    • 1970-01-01
    • 2012-02-01
    • 2021-09-22
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    相关资源
    最近更新 更多