Wie lösche ich die Ausgabe von Python-Druck?
Ich schlage fünf Möglichkeiten vor, dies zu tun:
- Rufen Sie in Python 3 auf
print(..., flush=True)
(das Flush-Argument ist in der Druckfunktion von Python 2 nicht verfügbar, und es gibt kein Analogon für die print-Anweisung).
- Rufen Sie dazu
file.flush()
die Ausgabedatei auf (wir können dazu die Druckfunktion von Python 2 umbrechen).sys.stdout
- Wenden Sie dies auf jeden Druckfunktionsaufruf im Modul mit einer Teilfunktion an,
print = partial(print, flush=True)
die auf das Modul global angewendet wird.
- Wenden Sie dies auf den Prozess
-u
an, indem Sie ein Flag ( ) an den Interpreter-Befehl übergeben
- Wenden Sie dies auf jeden Python-Prozess in Ihrer Umgebung mit an
PYTHONUNBUFFERED=TRUE
(und deaktivieren Sie die Variable, um dies rückgängig zu machen).
Python 3.3+
Mit Python 3.3 oder höher können Sie flush=True
der print
Funktion lediglich ein Schlüsselwortargument geben :
print('foo', flush=True)
Python 2 (oder <3.3)
Sie haben das flush
Argument nicht auf Python 2.7 zurückportiert. Wenn Sie also Python 2 (oder weniger als 3.3) verwenden und Code möchten, der sowohl mit 2 als auch mit 3 kompatibel ist, kann ich den folgenden Kompatibilitätscode vorschlagen. (Beachten Sie, dass sich der __future__
Import an / sehr "nahe der Oberseite Ihres Moduls " befinden muss.):
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. Eine ausführlichere Beschreibung finden Sie im six
Modul .
Alternativ können Sie einfach file.flush()
nach dem Drucken aufrufen , z. B. 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 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 gewohnt funktioniert:
>>> print('foo')
foo
Und wir können den neuen Standard tatsächlich überschreiben:
>>> print('foo', flush=False)
foo
Beachten Sie erneut, dass dies nur den aktuellen globalen Bereich ändert, da der Druckname im aktuellen globalen Bereich die integrierte print
Funktion überschattet (oder die Kompatibilitätsfunktion bei Verwendung einer in Python 2 in diesem aktuellen globalen Bereich nicht referenziert).
Wenn Sie dies innerhalb einer Funktion anstatt 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 einfach in den globalen Namespace einfügen, es sei denn, dieses spezifische Verhalten entspricht genau Ihren Wünschen.
Ändern der Standardeinstellung für den Prozess
Ich denke, die beste Option hier ist, das -u
Flag zu verwenden, um ungepufferte Ausgabe zu erhalten.
$ python -u script.py
oder
$ python -um package.module
Aus den Dokumenten :
Erzwinge, dass stdin, stdout und stderr völlig ungepuffert sind. Versetzen Sie auf Systemen, auf denen es darauf ankommt, auch stdin, stdout und stderr in den Binärmodus.
Beachten Sie, dass file.readlines () und File Objects (für line in sys.stdin) eine interne Pufferung aufweisen, 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 Umgebungen erhalten, die von der Umgebung erben, wenn Sie die Umgebungsvariable auf eine nicht leere Zeichenfolge setzen:
zB unter Linux oder OSX:
$ export PYTHONUNBUFFERED=TRUE
oder Windows:
C:\SET PYTHONUNBUFFERED=TRUE
aus den Dokumenten :
PYTHONUNBUFFERED
Wenn dies auf eine nicht leere Zeichenfolge festgelegt ist, entspricht dies der Angabe der Option -u.
Nachtrag
Hier ist die Hilfe zur Druckfunktion aus Python 2.7.12 - beachten Sie, dass es kein flush
Argument gibt:
>>> 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.
__future__
Version enthält keine,flush
weil "das Flush-Argument in Python 3.3 hinzugefügt wurde (nachdem print () über einen zukünftigen Import auf 2.7 zurückportiert wurdeAuch wie in diesem Blog vorgeschlagen, kann man
sys.stdout
im ungepufferten Modus wieder öffnen :Jeder
stdout.write
undprint
Betrieb wird anschließend automatisch gespült werden.quelle
UnsupportedOperation: IOStream has no fileno.
Mit Python 3.x wurde die
print()
Funktion erweitert:Sie können also einfach Folgendes tun:
Python Docs-Eintrag
quelle
Die Verwendung des
-u
Befehlszeilenschalters funktioniert, ist jedoch etwas ungeschickt. Dies würde bedeuten, dass sich das Programm möglicherweise falsch verhält, wenn der Benutzer das Skript ohne die-u
Option aufruft. Normalerweise benutze ich einen Brauchstdout
wie diesen:... Jetzt werden alle Ihre
print
Anrufe (diesys.stdout
implizit verwendet werden) automatischflush
bearbeitet.quelle
def __getattr__(self,name): return object.__getattribute__(self.f, name)
Warum nicht versuchen, eine ungepufferte Datei zu verwenden?
ODER
quelle
Dans Idee funktioniert nicht ganz:
Das Ergebnis:
Ich glaube, das Problem ist, dass es von der Dateiklasse erbt, was eigentlich nicht notwendig ist. Laut den Dokumenten für sys.stdout:
so verändernd
zu
macht es gut.
quelle
Hier ist meine Version, die auch writelines () und fileno () enthält:
quelle
file
, erhalte ich eine Fehlermeldung. Es gibt keinefile
Klasse.In Python 3 können Sie die Druckfunktion mit der Standardeinstellung überschreiben
flush = True
quelle
Ich habe es in Python 3.4 so gemacht:
quelle
Ich hatte zuerst Mühe zu verstehen, wie die Spüloption funktionierte. Ich wollte eine 'Ladeanzeige' machen und hier ist die Lösung, die ich gefunden habe:
Die erste Zeile löscht den vorherigen Druck und die zweite Zeile druckt eine neue aktualisierte Nachricht. Ich weiß nicht, ob hier eine einzeilige Syntax existiert.
quelle