1610 Stimmen

Wie kann ich die Ausgabe der Druckfunktion spülen (Python-Ausgabe entpuffern)?

Wie erzwinge ich Pythons print Funktion zur Ausgabe auf dem Bildschirm?

1913voto

CesarB Punkte 41671

In Python 3, print kann eine optionale flush Argument:

print("Hello, World!", flush=True)

In Python 2 müssen Sie Folgendes tun

import sys
sys.stdout.flush()

nach dem Aufruf print . Standardmäßig, print druckt nach sys.stdout (siehe die Dokumentation für weitere Informationen über Datei-Objekte ).

446voto

gimel Punkte 78080

Laufen python -h Ich sehe eine Kommandozeilenoption :

-u : ungepufferter binärer stdout und stderr; auch PYTHONUNBUFFERED=x siehe Manpage für Details zur internen Pufferung im Zusammenhang mit '-u'

Hier ist die einschlägige Dokumentation .

342voto

Eugene Sajine Punkte 7874

Seit Python 3.3 können Sie die normale print() Funktion zu spülen, ohne die Notwendigkeit, die sys.stdout.flush() setzen Sie einfach das Argument des Schlüsselworts "flush" auf true. Von die Dokumentation :

print(*objects, sep=' ', end=' \n ', file=sys.stdout, flush=False)

Druckt Objekte in die Stream-Datei, getrennt durch sep und gefolgt von end. sep, end und file, falls vorhanden, müssen als Schlüsselwortargumente angegeben werden.

Alle Nicht-Schlüsselwort-Argumente werden wie bei str() in Zeichenketten umgewandelt und in den Stream geschrieben, getrennt durch sep und gefolgt von end. Sowohl sep als auch end müssen Strings sein; sie können auch None sein, was bedeutet, dass die Standardwerte verwendet werden. Wenn keine Objekte angegeben werden, schreibt print() einfach end.

Das Argument file muss ein Objekt mit einer write(string)-Methode sein; wenn es nicht vorhanden oder None ist, wird sys.stdout verwendet. Ob die Ausgabe gepuffert wird, wird normalerweise durch file bestimmt, aber wenn das Schlüsselwortargument flush true ist, wird der Stream zwangsweise gespült.

276voto

Wie zu spülen Ausgabe von Python drucken?

Ich schlage fünf Möglichkeiten vor, dies zu tun:

  • In Python 3, rufen Sie print(..., flush=True) (das flush-Argument ist in der print-Funktion von Python 2 nicht verfügbar, und es gibt kein Analogon für die print-Anweisung).
  • Rufen Sie an. file.flush() auf der Ausgabedatei (wir können die print-Funktion von Python 2 dafür verwenden), zum Beispiel, sys.stdout
  • dies auf jeden Aufruf einer Druckfunktion im Modul mit einer Teilfunktion anwenden,
    print = partial(print, flush=True) auf das Modul global angewendet.
  • dies auf den Prozess mit einem Flag anwenden ( -u ) an den Interpreter-Befehl übergeben
  • wenden Sie dies auf jeden Python-Prozess in Ihrer Umgebung mit PYTHONUNBUFFERED=TRUE (und deaktivieren Sie die Variable, um dies rückgängig zu machen).

Python 3.3+

Wenn Sie Python 3.3 oder höher verwenden, können Sie einfach flush=True als Schlüsselwortargument für die print Funktion:

print('foo', flush=True) 

Python 2 (oder < 3.3)

Sie haben das Programm nicht zurückportiert. flush Argument zu Python 2.7 Also, wenn Sie Python 2 (oder weniger als 3.3) verwenden, und wollen Code, der sowohl mit 2 und 3 kompatibel ist, kann ich die folgende Kompatibilität Code vorschlagen. (Beachten Sie die __future__ Die Einfuhr muss "in der Nähe des oben auf Ihrem Modul "):

from __future__ import print_function
import sys

if sys.version_info[:2] < (3, 3):
    old_print = print
    def print(*args, **kwargs):
        flush = kwargs.pop('flush', False)
        old_print(*args, **kwargs)
        if flush:
            file = kwargs.get('file', sys.stdout)
            # Why might file=None? IDK, but it works for print(i, file=None)
            file.flush() if file is not None else sys.stdout.flush()

Der obige Kompatibilitätscode deckt die meisten Verwendungszwecke ab, aber für eine viel gründlichere Behandlung, siehe die six module .

Alternativ können Sie auch einfach file.flush() nach dem Drucken, zum Beispiel mit der print-Anweisung in Python 2:

import sys
print 'delayed output'
sys.stdout.flush()

Ändern der Standardeinstellung in einem Modul in flush=True

Sie können die Standardeinstellung für die Druckfunktion ändern, indem Sie functools.partial im globalen Bereich eines Moduls verwenden:

import functools
print = functools.partial(print, flush=True)

wenn Sie sich unsere neue Teilfunktion ansehen, zumindest in Python 3:

>>> print = functools.partial(print, flush=True)
>>> print
functools.partial(<built-in function print>, flush=True)

Wir können sehen, dass es ganz normal funktioniert:

>>> print('foo')
foo

Und wir können die neue Vorgabe sogar außer Kraft setzen:

>>> print('foo', flush=False)
foo

Beachten Sie noch einmal, dass dies nur den aktuellen globalen Bereich ändert, da der Druckname im aktuellen globalen Bereich die eingebaute print Funktion (oder referenzieren Sie die Kompatibilitätsfunktion, wenn Sie eine in Python 2 verwenden, in diesem aktuellen globalen Bereich).

Wenn Sie dies innerhalb einer Funktion und nicht im globalen Bereich eines Moduls tun wollen, sollten Sie ihr einen anderen Namen geben, z.B.:

def foo():
    printf = functools.partial(print, flush=True)
    printf('print stuff like this')

Wenn Sie es als global in einer Funktion deklarieren, ändern Sie es im globalen Namensraum des Moduls, also sollten Sie es einfach in den globalen Namensraum stellen, es sei denn, dieses spezielle Verhalten ist genau das, was Sie wollen.

Ändern der Standardeinstellungen für den Prozess

Ich denke, die beste Option ist hier, die -u Flag, um eine ungepufferte Ausgabe zu erhalten.

$ python -u script.py

ou

$ python -um package.module

Von der docs :

Erzwingt, dass stdin, stdout und stderr völlig ungepuffert sind. Auf Systemen, auf denen dies wichtig ist, sollten Sie stdin, stdout und stderr auch in den Binärmodus versetzen.

Beachten Sie, dass es eine interne Pufferung in file.readlines() und File Objects (für line in sys.stdin) gibt, die von dieser Option nicht beeinflusst wird. Um dies zu umgehen, sollten Sie file.readline() innerhalb einer while 1: Schleife verwenden.

Ändern der Standardeinstellungen für die Shell-Betriebsumgebung

Sie können dieses Verhalten für alle Python-Prozesse in der Umgebung oder Umgebungen, die von der Umgebung erben, erreichen, wenn Sie die Umgebungsvariable auf eine nicht leere Zeichenkette setzen:

z.B. in Linux oder OSX:

$ export PYTHONUNBUFFERED=TRUE

oder Windows:

C:\SET PYTHONUNBUFFERED=TRUE

von der docs :

PYTHONUNGEPUFFERT

Wenn dies auf eine nicht leere Zeichenkette gesetzt wird, ist es äquivalent zur Angabe der Option -u.


Nachtrag

Hier ist die Hilfe zur Funktion print aus Python 2.7.12 - beachten Sie, dass es eine keine flush Argument:

>>> from __future__ import print_function
>>> help(print)
print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file: a file-like object (stream); defaults to the current sys.stdout.
    sep:  string inserted between values, default a space.
    end:  string appended after the last value, default a newline.

72voto

Antony Hatchkins Punkte 28362

Außerdem, wie vorgeschlagen in dieser Blogbeitrag kann man wieder öffnen sys.stdout im ungepufferten Modus:

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

Jede stdout.write y print Operation wird anschließend automatisch gespült.

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