我正在尝试编写一个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
答案 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
。我想你会想出一个更好的解决方案。