import signal from contextlib import contextmanager @contextmanager def timeout(seconds): """ Wrapper for signals handling a timeout for being used as a decorator. """ def timeout_handler(signum, frame): pass original_handler = signal.signal(signal.SIGALRM, timeout_handler) try: signal.alarm(seconds) yield finally: signal.alarm(0) signal.signal(signal.SIGALRM, original_handler)