October 17, 2009
Non-blocking raw_input for Python
[Edited Aug. 30, 2010 to fix a typo in the function name and generally improve formatting]
I needed a way to allow a raw_input() call to time out. In case it's useful to anyone, I wrote this solution which works under Unix-like OS's.
import signal class AlarmException(Exception): pass def alarmHandler(signum, frame): raise AlarmException def nonBlockingRawInput(prompt='', timeout=20): signal.signal(signal.SIGALRM, alarmHandler) signal.alarm(timeout) try: text = raw_input(prompt) signal.alarm(0) return text except AlarmException: print '\nPrompt timeout. Continuing...' signal.signal(signal.SIGALRM, signal.SIG_IGN) return ''
typo error: nonBockingRawInput x nonBlockingRawInput
I also think that signal.alarm(0) is wrong. I needed to comment it in order to make it work.
Posted by: Juanjo at Aug 27, 2010 9:07:08 AM
Thanks for pointing out the typo in the function name.
But I don't know what to make of your comment about alarm(0). That's there to cancel the alarm once you've typed something in. It works under the Python versions I've tried. (Though note: as my post says at the top, this is only for unix-like OS's.)
See the example in the Python docs at the end of this page: http://docs.python.org/library/signal.html.
Anyone else have any experiences, pro-or-con, on that issue?
Also, if anyone has a version that works for Windows, I'd appreciate hearing about it!
Posted by: Gary Robinson at Aug 30, 2010 11:04:14 AM
Thats' really good stuff.
I have been searching for this for a while. Other recivpies, like http://code.activestate.com/recipes/134892/ are far more ugly!
Posted by: Heinrich at Sep 18, 2012 8:44:21 PM