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
的替代方法:

希望有帮助