« Snow Leopard Guest User data loss bug | Main | A Dog's Consciousness »
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 ''
October 17, 2009 in Python, Web/Tech | Permalink
Comments
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