等待用户输入或以定义的间隔运行的程序?

时间:2015-04-24 21:49:35

标签: python multithreading user-input keyboard-events

我目前有一个定期运行的程序。现在程序连续运行,每30分钟检查一次新文件:

def filechecker():
    #check for new files in a directory and do stuff

while True:
    filechecker()
    print '{} : Sleeping...press Ctrl+C to stop.'.format(time.ctime())
    time.sleep(1800)

但是,我也希望用户能够来到终端并输入击键来手动调用filechecker(),而不是等待程序从睡眠状态唤醒或不得不重新启动程序。这可能吗?我试着看看使用线程,但我无法弄清楚如何将计算机从睡眠中唤醒(没有多少线程经验)。

我知道我可以轻松做到:

while True:
    filechecker()
    raw_input('Press any key to continue')

完全手动控制,但我希望我的蛋糕也可以吃。

3 个答案:

答案 0 :(得分:4)

您可以使用带有KeyboardInterrupt的try / except块(这是在time.sleep()中使用Ctrl-C获得的。然后在except中,询问用户是否要立即退出或运行filechecker。 像:

while True:
    filechecker()
    try:
        print '{0} : Sleeping...press Ctrl+C to stop.'.format(time.ctime())
        time.sleep(10)
    except KeyboardInterrupt:
        input = raw_input('Got keyboard interrupt, to exit press Q, to run, press anything else\n')
        if input.lower() == 'q':
            break

答案 1 :(得分:3)

clindseysmith提供的解决方案引入了一个比原始问题要求更多的按键(至少,我的解释)。如果你真的想要结合问题中两个代码片段的效果,即你不想立即按Ctrl + C来调用文件检查器,这就是你可以做的:

import time, threading

def filechecker():
    #check for new files in a directory and do stuff
    print "{} : called!".format(time.ctime())

INTERVAL = 5 or 1800
t = None

def schedule():
    filechecker()
    global t
    t = threading.Timer(INTERVAL, schedule)
    t.start()

try:
    while True:
        schedule()
        print '{} : Sleeping... Press Ctrl+C or Enter!'.format(time.ctime())
        i = raw_input()
        t.cancel()
except KeyboardInterrupt:
    print '{} : Stopped.'.format(time.ctime())
    if t: t.cancel()

变量t保存调用文件检查器后调度的线程的id。按Enter键取消t并重新安排。按Ctrl-C取消t并停止。

答案 2 :(得分:0)

你可以这样做,按ctrl + c filechecker()将运行使用:

def filechecker():
    #check for new files in a directory and do stuff

filechecker()
while True:
    print '{} : Sleeping...press Ctrl+C to run manually.'.format(time.ctime())
    try:
        time.sleep(1800)
    except KeyboardInterrupt:
        filechecker()
   filechecker()