Frage Wie spült man die Druckfunktion aus?


Wie erzwinge ich Pythons Druckfunktion zur Ausgabe auf dem Bildschirm?

Dies ist kein Duplikat von Deaktivieren Sie die Pufferung der Ausgabe - Die verknüpfte Frage versucht eine ungepufferte Ausgabe, obwohl dies allgemeiner ist. Die Top-Antworten in dieser Frage sind zu mächtig oder involviert (sie sind keine guten Antworten dafür), und diese Frage kann bei Google von einem relativen Neuling gefunden werden.


886
2017-10-23 17:59


Ursprung


Antworten:


import sys
sys.stdout.flush()

Drucken druckt standardmäßig auf sys.stdout.

Verweise:


1049
2017-10-23 18:04



Laufen python -h, Ich sehe ein Befehlszeilenoption:

-u: ungepuffertes binäres stdout und stderr; auch PYTHONUNBUFFERED = x            Details zur internen Pufferung von '-u' finden Sie auf der man-Seite.

Hier ist das relevantes Dokument.


292
2017-10-23 18:06



Seit Python 3.3 kannst du das normale erzwingen print() Funktion zum Spülen ohne die Notwendigkeit zu verwenden sys.stdout.flush(); Setzen Sie einfach das Schlüsselwort "flush" auf "true". Von die Dokumentation:

print (* Objekte, sep = '', Ende = '\ n', Datei = sys.stdout, flush = False)

Drucken Sie 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 str () in Strings konvertiert und in den Stream geschrieben, getrennt durch sep und gefolgt von end. Sowohl sep als auch end müssen Saiten sein; Sie können auch Keine sein, was bedeutet, die Standardwerte zu verwenden. Wenn keine Objekte angegeben sind, schreibt print () einfach end.

Das Dateiargument muss ein Objekt mit einer write (string) -Methode sein; Wenn es nicht vorhanden ist oder None, wird sys.stdout verwendet. Ob die Ausgabe gepuffert wird, hängt normalerweise von der Datei ab. Wenn das Schlüsselwort flush jedoch wahr ist, wird der Stream zwangsweise geleert.


244
2018-04-17 20:10



Wie spült man die Ausgabe von Python-Print?

Ich schlage fünf Wege vor, dies zu tun:

  • Rufen Sie in Python 3 auf print(..., flush=True) (Das Argument flush ist in der Druckfunktion von Python 2 nicht verfügbar, und für die print-Anweisung gibt es kein Analog).
  • Anruf file.flush() auf die Ausgabedatei (wir können die Druckfunktion von Python 2 dazu umbrechen), zum Beispiel sys.stdout
  • wenden Sie dies auf jeden Druckfunktionsaufruf im Modul mit einer Teilfunktion an,
    print = partial(print, flush=True) auf das Modul global angewendet.
  • wenden Sie dies auf den Prozess mit einer Flagge (-u) an den Interpreter Befehl übergeben
  • Wenden Sie dies für jeden Python-Prozess in Ihrer Umgebung an PYTHONUNBUFFERED=TRUE (und die Variable aufheben, um dies rückgängig zu machen).

Python 3.3+

Mit Python 3.3 oder höher können Sie einfach bereitstellen flush=True als Keyword-Argument für die print Funktion:

print('foo', flush=True) 

Python 2 (oder <3.3)

Sie haben das nicht zurückportiert flush Argument zu Python 2.7 Wenn Sie also Python 2 (oder weniger als 3.3) verwenden und Code haben wollen, der sowohl mit 2 als auch mit 3 kompatibel ist, kann ich den folgenden Kompatibilitätscode vorschlagen. (Beachten Sie das __future__Der Import muss in der Nähe der Oberseite Ihres Moduls"):

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 wird die meisten Anwendungen abdecken, aber für eine viel gründlichere Behandlung, Siehe die six Modul.

Alternativ können Sie einfach anrufen 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 zu flush=True

Sie können den Standardwert für die Druckfunktion ändern, indem Sie functools.partial für den 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 wie normal funktioniert:

>>> print('foo')
foo

Und wir können den neuen Standard überschreiben:

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

Beachten Sie erneut, dass dies nur den aktuellen globalen Gültigkeitsbereich ändert, da der Druckname im aktuellen globalen Gültigkeitsbereich den eingebauten Namen überschattet print Funktion (oder Dereferenzierung der Kompatibilitätsfunktion, wenn Python 2 in diesem aktuellen globalen Bereich verwendet wird).

Wenn Sie dies innerhalb einer Funktion statt im globalen Bereich eines Moduls tun möchten, sollten Sie ihm einen anderen Namen geben, z.

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

Wenn Sie es in einer Funktion als global deklarieren, ändern Sie es im globalen Namespace des Moduls. Sie sollten es also nur in den globalen Namespace einfügen, es sei denn, dieses spezifische Verhalten ist genau das, was Sie wollen.

Ändern der Standardeinstellung für den Prozess

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

$ python -u script.py

oder

$ python -um package.module

Von dem Dokumente:

Erzwinge, dass stdin, stdout und stderr vollständig ungepuffert sind. Auf Systemen, in denen es darauf ankommt, setzen Sie auch stdin, stdout und stderr in den binären Modus.

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

Ändern der Standardeinstellung für die Shell-Betriebsumgebung

Sie können dieses Verhalten für alle Python-Prozesse in der Umgebung oder in den Umgebungen, die von der Umgebung erben, erhalten, wenn Sie die Umgebungsvariable auf eine nichtleere Zeichenfolge setzen:

z. B. in Linux oder OSX:

$ export PYTHONUNBUFFERED=TRUE

oder Windows:

C:\SET PYTHONUNBUFFERED=TRUE

von dem Dokumente:

PYTHONUNBUFFERED

Wenn dies auf eine nicht leere Zeichenfolge festgelegt ist, entspricht dies der Angabe der Option -u.


Nachtrag

Hier ist die Hilfe zur Druckfunktion von Python 2.7.12 - beachten Sie, dass es Nein  flush Streit:

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

100
2018-02-17 21:01



Auch wie in dieser Blog man kann wieder öffnen sys.stdout im ungepufferten Modus:

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

Jeder stdout.write und print Operation wird danach automatisch geleert.


65
2018-02-27 08:38



Verwendung der -u Befehlszeilenschalter funktioniert, aber es ist ein bisschen ungeschickt. Es würde bedeuten, dass das Programm sich möglicherweise falsch verhält, wenn der Benutzer das Skript ohne das Skript aufgerufen hat -u Möglichkeit. Ich benutze normalerweise einen Brauch stdout, so was:

class flushfile(object):
  def __init__(self, f):
    self.f = f

  def write(self, x):
    self.f.write(x)
    self.f.flush()

import sys
sys.stdout = flushfile(sys.stdout)

... Jetzt alle deine print Anrufe (die verwenden sys.stdout implizit), wird automatisch flushed.


30
2017-10-23 19:54



Mit Python 3.x erweiterten sie die print()Funktion:

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

Also, Sie können einfach tun:

print("Visiting toilet", flush=True)

Python-Dokumenteintrag


22
2017-10-21 17:23



Warum nicht versuchen, eine ungepufferte Datei zu verwenden?

f = open('xyz.log', 'a', 0)

ODER

sys.stdout = open('out.log', 'a', 0)

17
2018-04-12 10:57