Wie erzwinge ich Pythons print
Funktion zur Ausgabe auf dem Bildschirm?
Antworten
Zu viele Anzeigen?Die Verwendung des -u
Befehlszeilenschalter funktioniert, ist aber etwas umständlich. Es würde bedeuten, dass sich das Programm möglicherweise nicht korrekt verhält, wenn der Benutzer das Skript ohne den -u
Option. Normalerweise verwende ich eine benutzerdefinierte stdout
etwa so:
class flushfile:
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 sind alle Ihre print
Aufrufe (die mit sys.stdout
implizit), werden automatisch flush
Hrsg.
Dans Idee funktioniert nicht ganz:
#!/usr/bin/env python
class flushfile(file):
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)
print "foo"
Das Ergebnis:
Traceback (most recent call last):
File "./passpersist.py", line 12, in <module>
print "foo"
ValueError: I/O operation on closed file
Ich glaube, das Problem ist, dass sie von der Dateiklasse erbt, was eigentlich nicht notwendig ist. Laut der Dokumentation für sys.stdout:
stdout und stderr müssen nicht eingebaut sein Dateiobjekte: jedes Objekt ist akzeptabel solange es eine write()-Methode hat hat, die ein String-Argument akzeptiert.
so ändern
class flushfile(file):
zu
class flushfile(object):
funktioniert es einwandfrei.