2017-08-10 440 views
0

我有一个程序花了很多时间在无尽的循环中睡着,它每6小时检查一次另一个系统API,并且如果有变化会做一些事情,如果不回去睡觉。python按键来中断time.sleep()

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

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

打破这个是CTRL + C的唯一方法,但似乎丑陋的,是有没有办法让另一keypess中断time.sleep(),并用优美的sys.exit() ?

回答

1

我不知道这是否正是您正在寻找的内容,但我找到了一个使用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() 
+0

谢谢,生病必须在你的第一个解决方案看,但如果我理解正确的话,它不会赶上键盘按在脚本睡觉。 第二个看起来像用户必须抓住脚本,而不睡觉。 – Scalextrix

+0

准确地说,第一个将完成睡眠()并在之后退出。第二个会随时捕捉CTRL + Z(工作和睡眠)。你是否以一种方式去打断睡眠? – conFusl

+0

好的,谢谢,第二个是我想要的 – Scalextrix