Wie erzwinge ich Pythons print
Funktion zur Ausgabe auf dem Bildschirm?
Antworten
Zu viele Anzeigen?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 ).
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 .
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.
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.
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.
- See previous answers
- Weitere Antworten anzeigen