Python 如何从函数中定义的信号处理函数返回控件?
我正在编写一个小的、单一的函数,该函数设计用于请求用户输入,并带有时间延迟。当时间延迟结束时,函数应该返回Python 如何从函数中定义的信号处理函数返回控件?,python,return,signals,handler,Python,Return,Signals,Handler,我正在编写一个小的、单一的函数,该函数设计用于请求用户输入,并带有时间延迟。当时间延迟结束时,函数应该返回None,而不是用户的响应,然后继续脚本的其余部分 在当前的实现中,用户输入工作,超时工作,超时消息由函数中定义的信号处理函数打印(我的目标是使这个外部函数完全独立)。但是,处理会停止(而不是退出,而主函数中定义的循环),我不确定原因 如何使处理继续?我是否以某种方式误用了信号?是否可以使用lambda来代替显式定义的处理函数函数 #!/usr/bin/env python from __
None
,而不是用户的响应,然后继续脚本的其余部分
在当前的实现中,用户输入工作,超时工作,超时消息由函数中定义的信号处理函数打印(我的目标是使这个外部函数完全独立)。但是,处理会停止(而不是退出,而主函数中定义的循环),我不确定原因
如何使处理继续?我是否以某种方式误用了信号
?是否可以使用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()
您所得到的就快到了,但是您需要在信号处理程序中引发一个异常<代码>原始输入
将阻塞,直到发生输入或异常。如果您在信号处理程序中引发异常,则会中断raw\u输入
,执行将落入函数中的除
之外。这里有一个玩具的例子
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
的替代方法:
希望有帮助