Python - Run Job каждый первый понедельник месяца - PullRequest
5 голосов
/ 30 июня 2019

Справочная информация: мне нужно запускать автоматические задачи каждый первый и третий понедельник месяца для сервера.Это должно быть реализовано через python, а не crontab.

Я нашел модуль python "расписание", но его документация не детализирована.https://pypi.org/project/schedule/

https://schedule.readthedocs.io/en/stable/

Кто-нибудь знает, как это сделать?

import schedule

def TestFunction():
    pass

schedule.every(1).monday.do(TestFunction)
schedule.every(3).monday.do(TestFunction)
schedule.run_pending()

Будет ли это выполняться в первый понедельник года, месяца или каждогопонедельник

Ответы [ 2 ]

3 голосов
/ 30 июня 2019

Вот возможное решение:

import datetime

def something():
    day_of_month = datetime.now().day
    if (day_of_month > 7 and day_of_month < 15) or day_of_month > 21:
        return # not first / third monday of month
    # your code

schedule.every().monday.do(something())

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

1 голос
/ 30 июня 2019

Кажется, что пока эта функциональность не реализована в пакете schedule:

schedule.every(3).monday.do(test)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/schedule/__init__.py", line 302, in monday
    raise IntervalError('Use mondays instead of monday')
schedule.IntervalError: Use mondays instead of monday
>>> schedule.every(3).mondays.do(test)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'Job' object has no attribute 'mondays'

Я бы предложил использовать цикл while True и вручную проверить, является ли самый день первым понедельником месяца:

from datetime import datetime, date
import calendar

def find_first_monday(now):
    month_range = calendar.monthrange(now.year, now.month)
    date_corrected = date(now.year, now.month, 1)
    delta = (calendar.MONDAY - month_range[0]) % 7
    if not delta:
        return True
    return False

while True:
     now = datetime.now()
     if first_monday_of_the_month(now):
          TestFunction()
          time.sleep(24*3600)
...