673 Stimmen

Ausgangspufferung deaktivieren

Ist die Ausgabepufferung in Pythons Interpreter standardmäßig aktiviert für sys.stdout ?

Wenn die Antwort positiv ausfällt, welche Möglichkeiten gibt es, sie zu deaktivieren?

Bisherige Vorschläge:

  1. Verwenden Sie die -u Kommandozeilenschalter
  2. Wickeln sys.stdout in einem Objekt, das nach jedem Schreibvorgang geleert wird
  3. Satz PYTHONUNBUFFERED Umgebungsvariable
  4. sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

Gibt es eine andere Möglichkeit, ein globales Flag in sys / sys.stdout programmatisch während der Ausführung?

3voto

tzp Punkte 526

(Ich habe einen Kommentar gepostet, aber er ist irgendwie verloren gegangen, also nochmal:)

  1. Wie ich festgestellt habe, verhält sich CPython (zumindest unter Linux) unterschiedlich, je nachdem, wohin die Ausgabe geht. Wenn sie an ein tty geht, dann wird die Ausgabe nach jedem ' \n'
    Wenn es an eine Pipe/Prozess geht, wird es gepuffert und Sie können die flush() basierte Lösungen oder die -u die oben empfohlene Option.

  2. Das hängt ein wenig mit der Ausgabepufferung zusammen:
    Wenn Sie über die Zeilen in der Eingabe iterieren mit

    for line in sys.stdin:
    ...

dann die für Umsetzung in CPython sammelt die Eingabe für eine Weile und führt dann den Schleifenkörper für eine Reihe von Eingabezeilen aus. Wenn Ihr Skript im Begriff ist, für jede Eingabezeile eine Ausgabe zu schreiben, könnte dies wie eine Ausgabepufferung aussehen, aber in Wirklichkeit handelt es sich um eine Stapelverarbeitung, und daher wird keine der flush() usw. werden dabei helfen. Interessanterweise haben Sie dieses Verhalten nicht in pypy . Um dies zu vermeiden, können Sie Folgendes verwenden

while True: line=sys.stdin.readline()
...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X