Я пишу небольшую, единственную функцию, которая предназначена для запроса пользовательского ввода с задержкой по времени. Когда время задержки заканчивается, функция должна возвращать None
вместо ответа пользователя, а затем продолжить с остальной частью скрипта.Как можно вернуть управление из функции обработчика сигнала, которая была определена внутри функции?
В текущей реализации пользовательский ввод работает и тайм-аут работает с сообщением таймаута, напечатанным функцией обработчика сигнала, которая определена внутри функции (я хочу, чтобы эта внешняя функция была достаточно автономной). Однако обработка затем останавливается (а не выходит из цикла while
, определенного в функции main
), и я не уверен, почему.
Как я могу обработать, чтобы продолжить? Я неправильно использую signal
? Может ли использоваться лямбда вместо явно определенной функции для функции обработчика?
#!/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()