У меня проблемы с пониманием поведения 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 снова блокируется. Только когда я предоставлю дополнительные данные или закрою поток ввода, следующий символ (и все остальные) будет напечатан, хотя уже есть ожидающие символы! Может ли кто-нибудь объяснить мне такое поведение? Я вижу нечто подобное в программе потокового туннелирования, которую я написал, и это разрушает все дело.
Спасибо за чтение!