I'm writing a small, single function that is designed to request user input with a time delay. When the time delay runs out, the function should return None instead of a user's response and then should continue with the rest of the script.
In the current implementation, the user input works and the timeout works, with the timeout message printed by a signal handler function which is defined within the function (I'm aiming to have this outer function fairly self-contained). However, processing then halts (rather than exiting the while loop defined in the main function) and I'm not sure why.
How can I get processing to continue? Am I misusing signal in some way? Could a lambda be used in place of an explicitly-defined function for the handler function?
#!/usr/bin/env python
from __future__ import print_function
import signal
import propyte
def main():
    response = "yes"
    while response is not None:
        response = get_input_nonblocking(
            prompt  = "ohai? ",
            timeout = 5
        )
    print("start non-response procedures")
    # do things
def get_input_nonblocking(
    prompt          = "",
    timeout         = 5,
    message_timeout = "prompt timeout"
    ):
    def timeout_manager(signum, frame):
        print(message_timeout)
    #signal.signal(signal.SIGALRM, lambda: print(message_timeout))
    signal.signal(signal.SIGALRM, timeout_manager)
    signal.alarm(timeout)
    try:
        response = propyte.get_input(prompt)
        return response
    except:
        return None
if __name__ == '__main__':
    main()
 
     
    