ich bin auf folgendes Verhalten von 'select()' aufmerksam geworden und kann es mir nicht wirklich erklären. Zum Nachvollziehen hier ich ein Beispiel:
Code: Alles auswählen
import os
import select
import sys
import termios
import tty
class Cbreak(object):
def __init__(self):
self.old_term_settings = termios.tcgetattr(0)
def __enter__(self):
tty.setcbreak(0, termios.TCSADRAIN)
return self
def __exit__(self, type_, value, traceback):
termios.tcsetattr(0, termios.TCSAFLUSH, self.old_term_settings)
def write_(self, string_):
sys.stdout.write(string_)
sys.stdout.flush()
def wait_for_ready(timeout, terminal):
terminal.write_('wait_for_ready(timeout={0}) >> '.format(timeout))
if timeout is None:
ready, _, _ = select.select([0], [], [])
else:
ready, _, _ = select.select([0], [], [], timeout)
terminal.write_('ready: {0} >> '.format(ready))
return ready
def input_(manner, timeout=None):
with Cbreak() as terminal:
while True:
terminal.write_('\n')
wait_for_ready(timeout, terminal)
if manner == 'o':
terminal.write_('input_: >> ')
ch = os.read(0, 1)
terminal.write_(repr(ch))
else:
terminal.write_('input_: >> ')
ch = sys.stdin.read(1)
terminal.write_(repr(ch))
if ch == 'q':
break
- 'select()' wartet, weil nichts zum Auslesen vorhanden ist
--> drücke <left> ('\x1b', '[', 'D') - 'select()' gibt 'sys.stdin' als bereit zum Auslesen zurück.
Das geschieht 3 x in Folge, für jedes der 3 Zeichen in der Sequenz. - 'select()' wartet wieder, weil nichts (mehr) zum Auslesen vorhanden ist
- ...
- 'select()' wartet, weil nichts zum Auslesen vorhanden ist
--> drücke <left> ('\x1b', '[', 'D') - 'select()' gibt 'sys.stdin' als bereit zum Auslesen zurück.
Das geschieht 1 x für '\x1b' - 'select()' wartet, obwohl sich '[' und 'D' noch in 'sys.stdin' befinden.
--> drücke a - 'select()' gibt 'sys.stdin' als bereit zum Auslesen zurück.
Das geschieht 3 x in Folge für '[', 'D' und das 'a' - 'select()' wartet wieder, weil nichts (mehr) zum Auslesen vorhanden ist
- ...
- Descriptoren haben keinen Puffer.
- Sollte 'select()' auf den dahinterliegenden Dateipuffer prüfen, so müssten die restlichen Zeichen '[' und 'D' darin ja auch erkannt und somit ein 'ready' auslösen.
Ich bin ratlos...
mutetella