Python: 等待按键输入或超时

5
我有一个长时间运行的Python脚本在终端会话中(计算机是FreeBSD盒子),每9分钟执行一次任务。现在,我想随时打断睡眠调用,以便立即执行任务。 我该如何做到这一点?捕捉Ctrl + C不是一个选项,因为我需要它停止程序(而不仅仅是中断睡眠)。使用终端窗口和键盘可以做任何其他事情也没有问题。

2
“捕捉Ctrl+C不是一个选项,因为我需要它来停止程序。” - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams,有时候我需要停止程序,最简单的方法是按Ctrl+C。因此,我不想通过捕获KeyboardInterrupt来中断sleep - zneak
1
你是否需要通过仅按一次Ctrl+C来终止程序?您可以第一次捕获它并在第二次时将其杀死。那么,捕获另一个信号呢? - Thomas
你不能只是用Ctrl-\吗? - Ignacio Vazquez-Abrams
@Thomas,我想我可以捕获另一个信号。我不确定如何从Python中实现它,但如果你有信心发布一个回答,暗示SIGALRM并中断raw_input或类似的操作,那就可以了。然而,双倍的Ctrl+C会带来自己的问题,我更愿意避免。 - zneak
显示剩余4条评论
1个回答

3

在Thomas的建议下,我想出了这个函数:

import signal

def input_or_timeout(timeout):
    def nothing(sig, frame): pass
    signal.signal(signal.SIGALRM, nothing)
    signal.alarm(timeout)
    try:
        raw_input()
        signal.alarm(0)
    except (IOError, EOFError): pass

该函数等待最多 timeout 秒的输入。

在Windows下,你可以用 msvcrt 包中的 getch() 函数替换 raw_input() 函数。


1
在Windows下,您根本无法使用此代码,因为它不支持SIGALRM。 - Michał Bentkowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接