python键按下来中断time.sleep()

时间:2017-08-10 08:06:52

标签: python-2.7

我有一个程序,它花了很多时间在无限循环中睡着了,它每隔6小时就会检入另一个系统API,如果有变化会有一些东西,如果没有再回到睡眠状态。

没有列出所有代码,它非常简单;我有

while True:
    do some stuff
    time.sleep(21600)

打破这个问题的唯一方法是使用CTRL + C,但这看起来很难看,有没有办法让另一个keypess中断time.sleep()并使用一个优雅的sys.exit()?

2 个答案:

答案 0 :(得分:2)

我不知道它是否正是您要搜索的内容,但我找到了使用pynput的解决方案。

以下实现基本上是他们添加了循环的reference implementation

from pynput import keyboard
from time import sleep

exit_flag = False

def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(key.char))
    except AttributeError:
        print('special key {0} pressed'.format(key))

def on_release(key):
    print('{0} released'.format(key))

    if key == keyboard.Key.esc:
        global exit_flag
        exit_flag = True
        print("SET EXIT TO {}".format(exit_flag))
        return False

with keyboard.Listener(on_press=on_press,
    on_release=on_release) as listener:

    print("listen...")

    while not exit_flag:
        print("do something...")
        sleep(2)

    listener.join()

全局退出条件的解决方案并不是最干净的解决方案,但它确实起到了作用。

修改

我意识到你想在睡眠期间实际退出,这对于提议的实现也是不可能的。但是它可以选择捕获键盘中断并执行sys.exit()吗?将是一个非常简单的解决方案。

import time
import sys

while True:
    try:
        print("do something")
        time.sleep(10)
    except KeyboardInterrupt:
        print("to be able to exit script gracefully")
        sys.exit()

答案 1 :(得分:0)

我没有写任何代码,但这是我的想法......而不是像 sleep(21600) 这样的大睡眠时间创建一个运行 21600*1000 次并睡眠一毫秒的循环,并在该循环中保持监听键盘中断或按键。代码会很丑,所以我建议使用抽象。

附言为什么 21600*1000 而不是“21600 并睡一秒”,一秒并不准确。您在 sleep(1) 处于活动状态时按下键盘中断的可能性比您使用毫秒或微秒时要大。