之前我曾问过类似的问题,但这次有点不同。对我来说,以下代码应该可行。
import datetime
# run infinitly
while(True):
done = False
while(not done):
#
#main program
#
#stopping condition
if currenttime == '103000':
done = True
#continue with rest of program
然而,当它在上午10:30:00到达时,它不会继续执行其余的程序。
以下我知道的程序(在树莓派上):
import datetime
done = False
while not done:
currenttime = datetime.datetime.now().strftime('%H%M%S')
if currenttime != '103000':
print currenttime
if currenttime == '103000':
done = True
print 'It is 10:30:00am, the program is done.'
我在第一个例子中做了什么,这对我来说是合乎逻辑的。有谁知道为什么它不会退出那个循环并继续其余的?
答案 0 :(得分:3)
如果主程序需要很长时间才能运行,currenttime
可能会从102958
跳转到103005
。因此,完全跳过103000
。
答案 1 :(得分:1)
也许您需要在检查之前设置当前时间?此外,if
语句必须完全执行103000才能执行done = True
。
while(True):
done = False
while(not done):
#
#main program
#
# need to set current time
currenttime = datetime.datetime.now().strftime('%H%M%S')
#stopping condition (use >= instead of just ==)
if currenttime >= '103000':
done = True
#continue with rest of program
答案 2 :(得分:1)
请注意,不能保证循环在每个可用秒中都有一次迭代。系统负载越多,循环跳过一秒的可能性就越大,这可能是终止标准。还存在可以跳过秒的情况,例如,由于时间同步或夏令时问题。
您可以在几秒钟内预先计算timedelta,然后再睡几秒钟,而不是繁忙的等待循环。
优点:
示例:
import datetime
import time
def wait_until_datetime(target_datetime):
td = target_datetime - datetime.datetime.now()
seconds_to_sleep = td.total_seconds()
if seconds_to_sleep > 0:
time.sleep(seconds_to_sleep)
target_datetime = datetime.datetime(2025, 1, 1)
wait_until_datetime(target_datetime)
print "Happy New Year 2025!"
请注意,由于系统日期和时间设置的任意更改,这可能仍无法产生所需的行为。可能最好采用完全不同的策略来在特定时间执行特定命令。您是否考虑过使用cron作业实现所需的行为? (您可以向流程发送信号,从而发出信号以取消循环...)
答案 3 :(得分:0)
import datetime
done = False
while True:
currenttime = datetime.datetime.now().strftime('%H%M%S')
if currenttime >= '103000':
break
print currenttime
print 'It is 10:30:00am, the program is done.'
如果你不能使用break:
import datetime
done = False
while not done:
currenttime = datetime.datetime.now().strftime('%H%M%S')
if currenttime >= '103000':
done = True
else:
print currenttime
print 'It is 10:30:00am, the program is done.'