Schedule дату не учитывает. Но прямо говоря, реализовать самостоятельно не слишком сложно.
from typing import Dict, List, Tuple, Callable
import datetime
import time
def time_matches_mask(now: datetime.datetime, mask: Dict[str, float], delta: datetime.timedelta) -> bool:
'Проверяем, совпало ли текущее время с заданной маской с указанной точностью'
target = now.replace(**mask)
return abs(now - target) < delta
jobs: List[Tuple[Dict, Callable, Tuple]] = [] #Список элементов: маска, функция, аргументы
def call_pending(jobs, now: datetime.datetime, delta: datetime.timedelta):
for mask, func, args in jobs:
if time_matches_mask(now, mask, delta):
func(*args)
jobs.append( ({'seconds':30}, print, ('Hello world!',)) ) #когда число секунд = 30, вызвать print('Hello world!')
delta = datetime.timedelta(seconds=1) #с какой точностью измерять время?
while True:
time.sleep(1)
call_pending(jobs, datetime.datetime.now(), delta)
Правда, есть и тонкости. Стоит избегать вызовов 2 раза подряд из-за большой delta, можно заменить секундный цикл на ожидание до ближайшей задачи (с прерыванием, если список задач изменился). Ну и так далее.