2013-06-27 4 views
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(). Как я уже делал в цикле if, который бы установил done = True каждые 10 минут и закончил бы цикл и переходите к остальной части сценария ... пока он не осознает, что он находится в другом бесконечном цикле, а затем он должен начать все сначала.

Я запутался в том, как эта команда работает, или что-то не так с моим кодом? Или есть даже лучший способ сделать это? Сценарий будет запущен, но он не завершит внутренний цикл с этой остановкой.

+0

Вы, вероятно, не должны ставить петлю в петлю – Serial

+0

@ChristianCareaga Почему бы и нет? –

+0

ну, то youre infintely looping loop thats looping, который я не знаю, просто звучит, как будто есть более простой способ – Serial

ответ

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 
4

Существуют различные способы, чтобы сделать это , но держать близко к оригинальному дизайну, я бы закодировать внутренний цикл как:

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

(я предполагаю, что вы пытаетесь не делать с этим вторым if был сна до следующей минуты, когда вы weren» t готов выйти из цикла.)

+1

Ваш код форматирования испорчен. Я не могу редактировать/исправлять, потому что слишком мало изменений>. < – Christoph

-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» переменный, так как он передает смысл закончил. Однако, читая ваш код, кажется, что вы фактически приостанавливаете постоянный процесс.

Надеюсь, это поможет!

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)), это плохая форма.

1

Это не дает прямого ответа на вопрос, но на всякий случай все, чего вы хотите достичь, - это запустить код python каждые 10 минут, лучше реализовать его, используя 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 -e, чтобы добавить запись в кронтаб этого пользователя, который должен запустить сценарий, а также взглянуть на 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 

После редактирования вы должны заметить сообщение, как кронтаба: установка нового кронтаба, а затем вы сделали. Просто подождите и посмотрите, если это сработает.

Некоторые вещи отметить, а также: выход

  • В подлинника на стандартный вывод и стандартный поток ошибок отправляются Вам по почте после окончания. Посмотрите на tail -f /var/mail/moooeeeep (укажите свое имя пользователя). Вы также можете настроить Thunderbird для получения этих писем, чтобы легче их проверить.
  • Соответствие Wikipedia page является хорошим источником информации для более подробной информации.
  • Если вам нужно сохранить информацию о состоянии между независимыми прогонами сценария, рассмотрите возможность использования файла конфигурации для хранения этой информации состояния, например, используя pickle, shelve, sqlite, что угодно.