Запланируйте выполнение задачи на каждую пятницу, но не запускайте ее дважды, если она выполнена, и компьютер перезагружается в пятницу + делайте это на следующий день, если компьютер выключен в пятницу. - PullRequest
0 голосов
/ 22 марта 2019

Я пытался запланировать определенную задачу с помощью Python различными способами:

  • сворачивая мое собственное планирование (с time.sleep(3600) и проверять каждый час), см. Ниже
  • пробуя такие библиотеки, как schedule

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

  1. Если это сделано, и я перезагружаю компьютер (или перезапускаю скрипт Python) в пятницу, я не хочу, чтобы задача запускалась второй раз в тот же день
  2. , есликомпьютер выключен в пятницу, и я запускаю его в субботу, задача должна запуститься (потому что тогда не уже был запущен на этой неделе).

Как это сделать с помощью Python?

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

NB2: скрипт Pythonэто расписание запускает задачу автоматически при запуске Windows.


Вот то, что я пробовал, но это не такочень элегантно и не соответствует требованию 2. Более того, составление моего собственного расписания, вероятно, не оптимально, я ищу что-то «более высокого уровня».

try:
    with open('last.run', 'r') as f:
        lastrun = int(f.read())
except:
    lastrun = -1

while True:
        t = datetime.datetime.now()
        if t.weekday() == 4 and t.day != lastrun:
            result = doit()  # do the task
            if result:
                with open('last.run', 'w') as f:
                    f.write(str(t.day))
        print('sleeping...')
        time.sleep(3600)

1 Ответ

1 голос
/ 22 марта 2019

Поскольку требование 2 можно перефразировать как "if the computer is off on a Friday, the task should run the next time the computer is on", то вам нужно просто выполнить:

- Figure out the date when the task should run next time.
- Inside an endless loop:
    - if today is equal or greater than when the task should run next time:
        - run task and then (if successful) update when task should run to next Friday after today.

Обратите внимание, что, поскольку может случиться, что задание должно было выполняться в пятницу, которая была последним днем ​​его месяца, необходимо сохранить всю дату, а не только день месяца.

Чтобы вычислить дату следующей пятницы, см. Самый высокий в настоящее время оценочный ответ как рассчитать следующую пятницу

try:
    with open('next.run', 'r') as f:
        nextrun = datetime.date.fromordinal(int(f.read()))
except:
    # Calculate date of next Friday (including today if today is indeed a Friday)
    today = datetime.date.today()
    nextrun = today + datetime.timedelta( (4 - today.weekday()) % 7 )

while True:
        today = datetime.date.today()
        if today >= nextrun:
            result = doit()  # do the task
            if result:
                # Calculate date of next Friday after today (the day after next Thursday)
                daysuntilnext = (3 - today.weekday()) % 7) + 1
                nextrun = today + datetime.timedelta(daysuntilnext)
                with open('next.run', 'w') as f:
                    f.write(str(nextrun.toordinal()))
                # Optional: sleep for (daysuntilnext - 1) days
        print('sleeping...')
        time.sleep(3600)
...