我正在编写一个小型的单一功能,旨在通过延时请求用户输入。当时间延迟用完时,函数应该返回None
而不是用户的响应,然后应该继续使用脚本的其余部分。
在当前实现中,用户输入工作并且超时工作,超时消息由在函数内定义的信号处理函数打印(我的目标是使该外部函数相当自包含) 。但是,处理暂停(而不是退出while
函数中定义的main
循环),我不知道为什么。
如何继续处理?我是否以某种方式滥用signal
?是否可以使用lambda代替处理函数的显式定义函数?
#!/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()
答案 0 :(得分:2)
你所拥有的几乎就在那里,但你需要在你的信号处理程序中引发异常。 raw_input
将阻止,直到发生某些事情,无论是输入还是异常。如果在信号处理程序中引发异常,则会中断raw_input
并执行将落入except
函数中的get_input_non_blocking
。这是一个玩具示例。
import signal
def timeout(signum, frame):
raise IOError("bye!")
signal.signal(signal.SIGALRM, timeout)
def input():
try:
print("omgplz: ")
return raw_input()
except IOError:
return None
signal.alarm(5)
txt = input()
signal.alarm(0)
print(txt)
在此答案中使用select
进行了更多讨论和替代方法:Keyboard input with timeout in Python
希望有所帮助!