Странное поведение Python select ()

У меня проблемы с пониманием поведения select.select. Пожалуйста рассмотрим следующую программу Python:

def str_to_hex(s):
    def dig(n):
        if n > 9:
            return chr(65-10+n)
        else:
            return chr(48+n)
    r = ''
    while len(s) > 0:
        c = s[0]
        s = s[1:]
        a = ord(c) / 16
        b = ord(c) % 16
        r = r + dig(a) + dig(b)
    return r

while True:
    ans,_,_ = select.select([sys.stdin],[],[])
    print ans
    s = ans[0].read(1)
    if len(s) == 0: break
    print str_to_hex(s)

Я сохранил это в файле "test.py". Если вызвать его следующим образом:

echo 'hello' | ./test.py

, то я получаю ожидаемое поведение: никогда не выбирайте блоки и все данные распечатываются; затем программа завершает работу.

Но если я запускаю программу в интерактивном режиме, Я веду себя крайне нежелательно. Обратите внимание на следующий сеанс консоли:

$ ./test.py
hello
[<open file '<stdin>', mode 'r' at 0xb742f020>]
68

Затем программа зависает; select.select снова блокируется. Только когда я предоставлю дополнительные данные или закрою поток ввода, следующий символ (и все остальные) будет напечатан, хотя уже есть ожидающие символы! Может ли кто-нибудь объяснить мне такое поведение? Я вижу нечто подобное в программе потокового туннелирования, которую я написал, и это разрушает все дело.

Спасибо за чтение!

6
задан slowdog 15 May 2011 в 23:47
поделиться