gpt4 book ai didi

python - 如何从函数内定义的信号处理函数返回控制权?

转载 作者:行者123 更新时间:2023-12-01 03:54:24 26 4
gpt4 key购买 nike

我正在编写一个小型的单一函数,旨在延迟请求用户输入。当时间延迟结束时,该函数应返回 None 而不是用户的响应,然后应继续执行脚本的其余部分。

在当前的实现中,用户输入有效,超时有效,超时消息由函数内定义的信号处理函数打印(我的目标是让这个外部函数相当独立)。但是,处理然后停止(而不是退出 main 函数中定义的 while 循环),我不确定为什么。

如何才能继续处理?我是否以某种方式滥用了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()

最佳答案

您所得到的已经差不多了,但是您需要在信号处理程序中引发异常。 raw_input 将阻塞,直到发生某些事情(输入或异常)。如果您在信号处理程序中引发异常,则会中断 raw_input 并且执行将落入 get_input_non_blocking 函数中的 except 中。这是一个玩具示例。

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

希望有帮助!

关于python - 如何从函数内定义的信号处理函数返回控制权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37742959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com