# run infinitly
while(True):
done = False;
while(not done):
#Do Stuff
#Main Program
#stopping condition of inner while loop
if datetime.datetime.now().minute == 10:
done = True
if datetime.datetime.now().minute == 10:
time.sleep(60-datetime.datetime.now().second)
我无法弄清楚为什么这对我不起作用。整个脚本应该在无限循环上运行,然后内循环应该通过,直到每10分钟满足一次停止条件。
这是我的理解,也许我错了,使用datetime.datetime.now()。分钟就像我在if循环中所做的那样将每隔10分钟设置done = True,并且将结束循环并继续与脚本的其余部分...直到它意识到它在另一个无限循环中然后它应该从头开始。
我对此命令的工作方式感到困惑,或者我的代码有问题吗?或者甚至有更好的方法来做到这一点?该脚本将运行,但它不会以停止条件结束内部循环。
答案 0 :(得分:4)
有多种方法可以做到这一点,但保持接近原始设计,我将内循环编码为:
while(not done):
if datetime.datetime.now().minute % 10 == 0:
done = True
else:
time.sleep(60-datetime.datetime.now().second)
(我假设你试图用第二个if
睡觉,直到下一分钟,当你还没准备好退出循环时。)
答案 1 :(得分:1)
每隔十分钟分钟停止:1:10,2:10,3:10等。为了做到这一点,请使用以下内容:
import time
# in outer loop
inner_loop_start = time.time()
# in inner loop
now = time.time()
if now - inner_loop_start > 60*10:
# done= True and all that jazz
答案 2 :(得分:1)
不要在不断地检查是否超过一小时的时间,只是做一些数学并适当地睡觉。时间通常是确定性的。
import datetime
import time
def seconds_till_10past():
now = datetime.datetime.now()
delta = now.replace(minute=10, second=0) - now
return delta.seconds % 3600
while True:
time.sleep(seconds_till_10past())
print "Do something at 10 past the hour."
另外,不要将语句的参数括起来(例如while(True)
),这是不好的形式。
答案 3 :(得分:1)
这并没有直接回答这个问题,但是如果你想要首先想要实现的是每隔10分钟运行一些python代码,你最好用cron来实现它。
我假设你到目前为止有一个脚本在启动时以某种方式启动。它主要由无限循环,主程序和等待直到下一执行时间组件组成。例如,如下所示:
""" my_first_daemon.py
does something everytime the datetime minute part is fully divisible by ten
"""
while True:
# do something at 00,10,20,30,40,50 (minutes) every hour
print "Hello World!"
# wait until the next execution time
wait_until_next_ten_minute_time()
如果确实如此,我建议将脚本的主要部分移动到单独的脚本中。例如,如下所示:
""" my_first_cronjob.py
is run by cron everytime the datetime minute part is fully divisible by ten
"""
# do something at 00,10,20,30,40,50 (minutes) every hour
print "Hello World!"
您继续并添加到您的crontab(使用命令crontab -e
将条目添加到该用户的运行该脚本的crontab,同时查看manpage)。例如:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
# example entry:
# (divide minute-star by 10 to get it run every 10 minutes)
*/10 * * * * python /path/to/my_first_cronjob.py
在编辑之后,你应该注意到像 crontab这样的消息:安装新的crontab ,然后你就完成了。只需等待,看看它是否有效。
有些事情需要注意:
tail -f /var/mail/moooeeeep
(指定您的用户名)。您还可以配置Thunderbird来获取这些邮件,以便更轻松地检查它们。答案 4 :(得分:-1)
从我上面的评论中扩展:
tic = datetime.datetime.now()
while True:
# do stuff
toc = datetime.datetime.now() - tic
if toc.minute > 10:
tic = datetime.datetime.now();
time.sleep(60-datetime.datetime.now().second)
我删除了“done
”变量,因为它传达了完成的含义。但是,通过阅读您的代码,实际上您似乎实际上正在暂停一个持续的过程。
希望这有帮助!