Python stdout spülen nicht richtig nach Flüche Aufruf
Frage
Ich habe ein Programm, dass Anwendungen Flüche, und dann kehrt zum Haupt Skript zur weiteren Verarbeitung. Nachdem er zurückkehrt, wird meine nachfolgende Ausgabe auf stdout nicht angezeigt, bis es gibt eine große Menge davon (zum Beispiel Tausende von Bytes).
Ich habe das Problem auf ein sehr einfaches Programm reduziert, die zuverlässig fehlschlägt:
import curses
import time
curses.initscr()
curses.endwin()
print "Hello world!"
time.sleep(5)
Wenn ich die beiden Flüche Anrufe auf Kommentar, die ‚Hallo Welt!‘ druckt, bevor die Verzögerung. Wenn ich sie in setzen, druckt er nach der Verzögerung (wenn das Script beendet).
Lösung
Der curses.endwin()
Aufruf „setzt Standard-I / O wieder normal“ ... was leider bedeutet „gepuffert“ (Sie, dass ein Fehler in curses
in Erwägung ziehen könnten und den Fehler auf Python-Tracker-Datei).
Standard-Ausgabe, um sicherzustellen, ungepufferte,
import os
sys.stdout = os.fdopen(0, 'w', 0)
(Sie können die import os
am Anfang setzen, oder natürlich, die Umverteilung von sys.stdout
sollen direkt nach dem endwin
Aufruf gehen).
Andere Tipps
Alex schlug mich zu ihm (er wußte, ich hatte es herauszufinden), aber ich habe diesen netten Kontext-Manager, die Sie verwenden können können.
import curses
import time
import os
import sys
class CursesStdout(object):
def __enter__(self):
pass
def __exit__(self, *args):
sys.stdout = sys.__stdout__ = os.fdopen(sys.__stdout__.fileno(), 'w', 0)
with CursesStdout():
curses.initscr()
curses.endwin()
print "Hello world!"
time.sleep(2)
ändern I sys.__stdout__
direkt, denn wenn man an der Quelle in curses/__init__.py
schauen Sie sehen, dass die initscr
Funktion übergibt diesen Dateideskriptor an den C-Code und so ich, dass speichere wieder auf normal sein.
freiere Art und Weise:
import sys
import curses
correct_stdout = sys.stdout # remember correct
curses.initscr()
curses.endwin()
sys.stdout = correct_stdout # restore correct
Ich habe festgestellt, dass tis ist System / Library abhängig. Auf meinem Windows-Rechner (Flüche von http://www.lfd.uci.edu/~ Gohlke / pythonlibs / ) es spült und dann schläft, aber auf Linux spült es nach dem Schlaf. Ich denke, man kann einfach nutzen: sys.stdout.flush()
wie:
print "Hello world!"
sys.stdout.flush()
time.sleep(5)
(kann es besser sein, eine Art von „Druck & bündig“ machen Funktion)