每隔一段时间重复一次声音/动作

时间:2015-05-31 15:41:41

标签: python date time while-loop repeat

我正在尝试编写一个Python程序,每隔一小时就会重现一次声音,但它并没有真正起作用。当我测试代码并指定时间到来时,它会一直重复声音。

以下是代码:

import os
from datetime import datetime

now = datetime.now()
currentHour = now.hour
currentMin = now.minute

#I also tested with if but it didn't work
while currentHour==15 and currentMin==33:
    os.system("aplay /home/pi/sound.wav") #Plays the sound thru aplay

2 个答案:

答案 0 :(得分:2)

你的逻辑错了。

首先,while循环很可能在第一次迭代中结束,并且您希望程序继续,直到您告诉它。

除此之外,你不会更新循环中的now变量,这基本上是个坏主意。

例如,此代码将继续运行,当它为15:33时,声音将仅播放一次。

myHour = 15
myMin = 33
is_played = False
while True:
    now = datetime.now()
    currentHour = now.hour
    currentMin = now.minute
    if currentHour == myHour and currentMin == myMin and not is_played:
        is_played = True
        os.system("aplay /home/pi/sound.wav")
    if currentHour != myHour or currentMin != myMin:
        is_played = False

Xiaotian Pei提出了一个好主意,为了有效地使用您的CPU资源,让我们使用Timer模块:

def to_play_sound(hour, min):
    now = datetime.now()
    currentHour = now.hour
    currentMin = now.minute
    if currentHour == hour and currentMin == min and not is_played:
        is_played = True
        os.system("aplay /home/pi/sound.wav")
    if currentHour != myHour or currentMin != myMin:
        is_played = False
while True:
    t = Timer(30.0, to_play_sound, [15, 33])
    t.start()

J.F. Sebastian也提出了一个好主意:

import datetime
import subprocess
while True:
    now = datetime.now()
    # compute `deadline`
    while True:
        deadline = now.replace(hour=hour, minute=min)
        if deadline > now:
            break
        else:
            deadline += datetime.timedelta(1)
    sleep_until(deadline) # sleep
    subprocess.check_call(['aplay', '/home/pi/sound.wav']) # play the sound!

了解sleep_until的实施方式here

答案 1 :(得分:1)

这是@ bshuster13答案的补充。

您需要的是timer。使用繁忙的循环并检测是否是正确的时间做某事并不是一个好主意。看看python中的Timer。我想你会想出一个更好的解决方案。