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?

71voto

Noah Krasser Punkte 1051

Mit Python 3.x wird die print() Funktion wurde erweitert:

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

Sie können also einfach tun:

print("Visiting toilet", flush=True)

Python Docs Eintrag

40voto

Dan Lenski Punkte 72055

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.

20voto

Verwenden Sie eine ungepufferte Datei:

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

Oder

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

18voto

user263387 Punkte 427

In Python 3 können Sie die drucken Funktion mit der Standardeinstellung flush = True

def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True):
    __builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)

17voto

Kamil Kisiel Punkte 18687

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.

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