673 Stimmen

Ausgangspufferung deaktivieren

Ist die Ausgabepufferung in Pythons Interpreter standardmäßig aktiviert für sys.stdout ?

Wenn die Antwort positiv ausfällt, welche Möglichkeiten gibt es, sie zu deaktivieren?

Bisherige Vorschläge:

  1. Verwenden Sie die -u Kommandozeilenschalter
  2. Wickeln sys.stdout in einem Objekt, das nach jedem Schreibvorgang geleert wird
  3. Satz PYTHONUNBUFFERED Umgebungsvariable
  4. sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

Gibt es eine andere Möglichkeit, ein globales Flag in sys / sys.stdout programmatisch während der Ausführung?

4voto

stderr Punkte 8311

Eine Möglichkeit, eine ungepufferte Ausgabe zu erhalten, wäre die Verwendung von sys.stderr anstelle von sys.stdout oder einfach anrufen sys.stdout.flush() um einen Schreibvorgang explizit zu erzwingen.

Sie könnten alles Gedruckte einfach umleiten:

import sys; sys.stdout = sys.stderr
print "Hello World!"

Oder die Weiterleitung nur für eine bestimmte print Erklärung:

print >>sys.stderr, "Hello World!"

Um stdout zurückzusetzen, können Sie einfach tun:

sys.stdout = sys.__stdout__

4voto

jimx Punkte 994

Sie können auch fcntl verwenden, um die Dateiflags im laufenden Betrieb zu ändern.

fl = fcntl.fcntl(fd.fileno(), fcntl.F_GETFL)
fl |= os.O_SYNC # or os.O_DSYNC (if you don't care the file timestamp updates)
fcntl.fcntl(fd.fileno(), fcntl.F_SETFL, fl)

4voto

Vasily E. Punkte 53

Es ist möglich, Folgendes außer Kraft zu setzen nur write Methode der sys.stdout mit einem, der die flush . Die vorgeschlagene Methode wird im Folgenden erläutert.

def write_flush(args, w=stdout.write):
    w(args)
    stdout.flush()

Standardwert von w Argument wird die ursprüngliche write Referenzmethode. Nach write_flush definiert ist, wird die ursprüngliche write außer Kraft gesetzt werden kann.

stdout.write = write_flush

Der Code geht davon aus, dass stdout wird auf diese Weise importiert from sys import stdout .

3voto

S.Lott Punkte 371691

Sie können eine ungepufferte Datei erstellen und diese Datei sys.stdout zuweisen.

import sys 
myFile= open( "a.log", "w", 0 ) 
sys.stdout= myFile

Sie können das vom System bereitgestellte stdout nicht auf magische Weise ändern, da es vom Betriebssystem an Ihr Python-Programm geliefert wird.

3voto

Laimis Punkte 39

Variante, die ohne Absturz funktioniert (zumindest auf win32; python 2.7, ipython 0.12) und anschließend (mehrfach) aufgerufen wird:

def DisOutBuffering():
    if sys.stdout.name == '<stdout>':
        sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

    if sys.stderr.name == '<stderr>':
        sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', 0)

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