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