如何从函数中定义的信号处理函数返回控制?

时间:2016-06-10 07:58:57

标签: python return signals handler

我正在编写一个小型的单一功能,旨在通过延时请求用户输入。当时间延迟用完时,函数应该返回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()

1 个答案:

答案 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

希望有所帮助!