2016-06-03 9 views
0

Mein Python-Code gibt einen Druck in Java in einer while true Schleife erwerben, aber nicht gedruckt, wenn ich in einem Schlaf setzen, auch nach der Dauer des Schlafes gibt es keine Ausgabe in Javakann nicht Python Ausgabe

print 33 
import time 

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

Dies ist der Python-Code. Ich führe dies aus einem Java-Code

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); 
      } 
     } 
    }  
} 
+0

Hinzufügen von [ 'sys.stdout.flush()'] (https://docs.python.org/2/library /io.html#io.IOBase.flush), nachdem die Druckanweisung auch nicht hilft? – dhke

+0

Danke, das hat es behoben – Uruar

+1

Zur Erklärung: Der Ausgabestrom ist gepuffert, d. H. 'Print' verursacht nur die tatsächliche Ausgabe, wenn der Puffer voll ist oder wenn der Datenstrom explizit geleert wird. Bei kleinen Teilen der Ausgabe verlassen Ihre Daten den Python-Prozess nie und bleiben im Stream-Puffer. Datei unter * das übliche Problem mit Streams * – dhke

Antwort

0

Dies ist ein häufiges Problem. Python (und C, für die Angelegenheit) Ströme sind buffered.

In Ihrem Fall bedeutet dies, dass eine print nicht notwendig sofortige Ausgabe, sondern füllt den Ausgabepuffer des Streams.

Die Java-Seite des Programms empfängt nur einmal Daten, nachdem der Puffer voll ist (und dann den vollständigen Puffer, für den genau der Puffer gedacht ist: Vermeiden von Systemaufrufen für kleine IO). Jetzt, da die Standard-Puffergröße typischerweise 8.192 Byte ist und angenommen wird, dass die print 1 2 Bytes ('1\n') für jede Schleife schreibt, würde es mehr als 40 Sekunden dauern, bis der Puffer gefüllt ist. Daher könnte es so aussehen, als würde das Java-Programm keine Eingabe erhalten, während wir tatsächlich einfach darauf warten, dass der Ausgabepuffer auf der Python-Seite gefüllt wird.

Wenn Sie die sleep() entfernen, füllen Sie den Puffer so schnell wie möglich und verursachen einen fast sofortigen Schreibvorgang.

können Sie den Strom zwingen, den Puffer zu leeren, dieses Problem zu vermeiden:

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