Seite 1 von 1

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

Verfasst: Samstag 8. Oktober 2011, 10:57
von mutetella
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

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

Verfasst: Samstag 8. Oktober 2011, 11:47
von DasIch
Um sicherzustellen dass nichts gebuffert wird musst du auch bei 2.x .flush() aufrufen.