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).

War es hilfreich?

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)

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