0
# 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().minute 就像我在 if 循环中所做的那样,每 10 分钟设置一次 done = True,然后结束循环并继续其余的脚本......直到它意识到它处于另一个无限循环中,然后它应该重新开始。

我是否对这个命令的工作方式感到困惑,还是我的代码有问题?还是有更好的方法来做到这一点?该脚本将运行,但它不会以该停止条件结束内部循环。

4

5 回答 5

4

有多种方法可以做到这一点,但要保持接近您的原始设计,我会将内部循环编码为:

while(not done):
    if datetime.datetime.now().minute % 10 == 0:
        done = True
    else:
        time.sleep(60-datetime.datetime.now().second)

(我假设您在那一秒内试图做的if是睡眠,直到下一分钟您还没有准备好退出循环。)

于 2013-06-27T20:25:26.547 回答
1

这并不能直接回答这个问题,但如果你首先想要实现的只是每(比如)10 分钟运行一次 python 代码,你最好使用cron来实现它。

到目前为止,我假设您有一个脚本,该脚本以某种方式在启动时启动。它主要由一个无限循环、一个主过程和一个wait-until-next-execution-time组件组成。例如像下面这样:

""" 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 中,该条目将运行该脚本,还请查看手册页)。例如像这样:

# 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,然后您就完成了。稍等一下,看看它是否有效。

还有一些需要注意的地方:

  • 脚本对 stdout 和 stderr 的输出在终止后通过邮件发送给您。看看tail -f /var/mail/moooeeeep(指定您的用户名)。您还可以配置 Thunderbird 来获取这些邮件,以便更轻松地检查它们。
  • 相应的Wikipedia 页面是获取更多详细信息的非常好的信息来源。
  • 如果您需要在脚本的独立运行之间保留状态信息,请考虑使用配置文件来存储此状态信息,例如,使用pickleshelvesqlite等。
于 2013-06-29T08:01:23.603 回答
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
于 2013-06-27T20:22:36.550 回答
1

与其不停地检查是否已经过了 10 点,不如做一些数学运算并适当地睡觉。时间通常是确定性的。

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))的参数加上括号,这是不好的形式。

于 2013-06-27T20:58:09.913 回答
-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”变量,因为它传达了完成的含义。但是,通过阅读您的代码,您实际上似乎实际上是在暂停一个一直在进行的过程。

希望这可以帮助!

于 2013-06-27T20:46:29.310 回答