I'm having some trouble understanding the behavior of select.select. Please consider the following Python program:
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) / 16b = ord(c) % 16r = r + dig(a) + dig(b)return rwhile True:ans,_,_ = select.select([sys.stdin],[],[])print anss = ans[0].read(1)if len(s) == 0: breakprint str_to_hex(s)
I have saved this to a file "test.py". If invoke it as follows:
echo 'hello' | ./test.py
then I get the expected behavior: select never blocks and all of the data is printed; the program then terminates.
But if I run the program interactively, I get a most undesirable behavior. Please consider the following console session:
$ ./test.py
hello
[<open file '<stdin>', mode 'r' at 0xb742f020>]
68
The program then hangs there; select.select is now blocking again. It is not until I provide more input or close the input stream that the next character (and all of the rest of them) are printed, even though there are already characters waiting! Can anyone explain this behavior to me? I am seeing something similar in a stream tunneling program I have written and it's wrecking the entire affair.
Thanks for reading!