« 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

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!

Best,
Heinrich

Posted by: Heinrich at Sep 18, 2012 8:44:21 PM

Post a comment