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



我目前有一个定期运行的程序。现在程序连续运行,每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')

用于完全手动控制,但我希望我的蛋糕也吃掉它。

你可以使用 try/except 块和 KeyboardInterrupt(这是你在 time.sleep() 中使用 Ctrl-C 得到的)。 然后在例外中,询问用户是否要立即退出或运行文件检查器。喜欢:

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 elsen')
        if input.lower() == 'q':
            break

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并停止。

你可以通过按 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()

相关内容

  • 没有找到相关文章

最新更新