Frage

Ich muss etwas schrecklich offensichtlich sein Blick. Ich brauche ein C-Programm auszuführen, in Echtzeit seine Ausgabe anzuzeigen und schließlich seine letzte Zeile zu analysieren, was einfach sein sollte als die letzte Zeile gedruckt ist immer gleich.

process = subprocess.Popen(args, shell = True,  
                           stdout = subprocess.PIPE, stderr = subprocess.PIPE)

# None indicates that the process hasn't terminated yet.
while process.poll() is None:

    # Always save the last non-emtpy line that was output by the child
    # process, as it will write an empty line when closing its stdout.
    out = process.stdout.readline()
    if out:
        last_non_empty_line = out

    if verbose:
        sys.stdout.write(out)   
        sys.stdout.flush()

# Parse 'out' here...

Einmal in einer Weile, jedoch ist die letzte Zeile nicht gedruckt. Der Standardwert für Popens der bufsize 0, so es soll ungepufferte sein. Ich habe auch versucht, ohne Erfolg, das Hinzufügen fflush (stdout) zu dem C-Code nur vor dem Verlassen, aber es scheint, dass es absolut keine Notwendigkeit, einen Strom zu spülen, bevor Sie ein Programm zu beenden.

Ideen anyone?

War es hilfreich?

Lösung

readline() hat den Text zu puffern, für eine neue Linie zu warten.

Sie werden immer eine Race-Bedingung haben - keine Menge von un-buffered Ströme wird die Tatsache umgehen, dass Sie eine Linie sind Handhabung, dann Ausfahrt Prüfung, dann eine Zeile zu lesen, so dass, wenn die subprocess Ausgänge, während Sie eine Linie der Handhabung, werden Sie nichts anderes lesen. Darüber hinaus wird die Schale wahrscheinlich seine eigene Pufferung eingeführt wird.

So können Sie entweder:

  1. Mit communicate() und geben Sie die ausführliche Ausgabe während der Subprozess läuft.

  2. Stellen Sie sicher, lesen Sie weiter, nachdem der Prozess beendet wurde, bis Sie EOF erhalten.

Ich würde auch empfehlen, ändern Sie den Code, so dass Sie nicht verwenden shell=True.

Andere Tipps

Das Problem ist, dass Sie Linien bis der Prozess beendet lesen, (process.poll()), während Sie wegen der Shell-Flagge Verwendung Pufferung tun.

Sie würde halten müssen lesen process.stdout, bis Sie das Ende der Datei oder die leeren Zeile erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top