无法获取python输出

时间:2016-06-03 11:45:26

标签: java python sleep

我的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);
            }
        }
    }    
}

1 个答案:

答案 0 :(得分:0)

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

在您的情况下,这意味着dashboardView不必导致立即输出,而是填充流的输出缓冲区。

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

如果删除'1\n',则尽可能快地填充缓冲区,导致几乎立即写入。

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

sleep()