sys.stdout.write() verhält sich ab Python 3 anderst...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

soweit ich die Doku richtig verstanden habe, ist 'sys.stdout' seit Python 3 ein Exemplar von 'io.TextIOBase'. Eine Konsequenz daraus ist, dass mit 'write()' übergebener Text gebuffered wird um die ebenfalls neue Möglichkeit des 'on-the-fly'-en-/decodings zu beschleunigen.
Das wiederum hat zur Folge, dass eben dieser Text im buffer und nicht auf dem Bildschirm landet.

Darum geht es mir konkret:

Code: Alles auswählen

def input_():
    old_term_settings = termios.tcgetattr(sys.stdin)
    tty.setraw(sys.stdin)
    try:
        while True:
            ch = sys.stdin.read(1)
            if ch == 'q':
                break
            sys.stdout.write(ch)
            sys.stdout.flush()    #Needed under Python 3 above
    finally:
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_term_settings)
Meine Frage ist nun, ob ich das richtig verstanden habe oder meine Python 3 Lösung zwar funktioniert, aber mit dem veränderten Verhalten von Py3-'stdout.write()' gegenüber Py2-'stdout.write()' nichts zu tun hat.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Um sicherzustellen dass nichts gebuffert wird musst du auch bei 2.x .flush() aufrufen.
Antworten