Python-запуск функции в заданное время
Как я могу запустить функцию в Python , в данный момент времени?
Например:
run_it_at(func, '2012-07-17 15:50:00')
И он будет запускать функцию func в 2012-07-17 15:50:00.
Я попробовал sched.планировщик , но он не запустил мою функцию.
import time as time_module
scheduler = sched.scheduler(time_module.time, time_module.sleep)
t = time_module.strptime('2012-07-17 15:50:00', '%Y-%m-%d %H:%M:%S')
t = time_module.mktime(t)
scheduler_e = scheduler.enterabs(t, 1, self.update, ())
Что я могу сделать?
6 ответов:
Чтение документов из http://docs.python.org/py3k/library/sched.html :
Исходя из этого, нам нужно выработать задержку (в секундах)...
from datetime import datetime now = datetime.now()Затем используйте
datetime.strptimeдля разбора '2012-07-17 15: 50: 00' (я оставлю вам строку формата)# I'm just creating a datetime in 3 hours... (you'd use output from above) from datetime import timedelta run_at = now + timedelta(hours=3) delay = (run_at - now).total_seconds()Затем можно использовать
delayдля перехода в экземплярthreading.Timer, например:threading.Timer(delay, self.update).start()
Взгляните на расширенный планировщик Python, APScheduler: http://packages.python.org/APScheduler/index.html
У них есть пример именно для этого usecase: http://packages.python.org/APScheduler/dateschedule.html
from datetime import date from apscheduler.scheduler import Scheduler # Start the scheduler sched = Scheduler() sched.start() # Define the function that is to be executed def my_job(text): print text # The job will be executed on November 6th, 2009 exec_date = date(2009, 11, 6) # Store the job in a variable in case we want to cancel it job = sched.add_date_job(my_job, exec_date, ['text'])
Вот обновление ответа стефенбеза для версии 3.5 APScheduler с использованием Python 2.7:
import os, time from apscheduler.schedulers.background import BackgroundScheduler from datetime import datetime, timedelta def tick(text): print(text + '! The time is: %s' % datetime.now()) scheduler = BackgroundScheduler() dd = datetime.now() + timedelta(seconds=3) scheduler.add_job(tick, 'date',run_date=dd, args=['TICK']) dd = datetime.now() + timedelta(seconds=6) scheduler.add_job(tick, 'date',run_date=dd, kwargs={'text':'TOCK'}) scheduler.start() print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C')) try: # This is here to simulate application activity (which keeps the main thread alive). while True: time.sleep(2) except (KeyboardInterrupt, SystemExit): # Not strictly necessary if daemonic mode is enabled but should be done if possible scheduler.shutdown()
Я столкнулся с той же проблемой: я не мог получить абсолютные временные события, зарегистрированные с помощью
sched.enterabs, чтобы быть распознаннымиsched.run.sched.enterработал для меня, если я вычислялdelay, но неудобно использовать, так как я хочу, чтобы задания выполнялись в определенное время дня в определенных часовых поясах.В моем случае я обнаружил, что проблема заключалась в том, что по умолчанию
timefuncв инициализатореsched.schedulerНеtime.time(как в Примере ), а скорееtime.monotonic.time.monotonicне имеет никакого смысла для "абсолютных" графиков времени, поскольку, из документа docs , "точка отсчета возвращаемого значения не определена, так что допустима только разница между результатами последовательных вызовов."Решением для меня было инициализировать планировщик как
scheduler = sched.scheduler(time.time, time.sleep)Неясно, является ли ваш time_module.время-это на самом деле время.время или время.монотонный, но он прекрасно работает, когда я инициализирую его должным образом.
Может быть стоит установить эту библиотеку: https://pypi.python.org/pypi/schedule , в основном помогает делать все, что вы только что описали. Вот пример:
import schedule import time def job(): print("I'm working...") schedule.every(10).minutes.do(job) schedule.every().hour.do(job) schedule.every().day.at("10:30").do(job) schedule.every().monday.do(job) schedule.every().wednesday.at("13:15").do(job) while True: schedule.run_pending() time.sleep(1)
dateSTR = datetime.datetime.now().strftime("%H:%M:%S" ) if dateSTR == ("20:32:10"): #do function print(dateSTR) else: # do something useful till this time time.sleep(1) passПросто ищу триггер события времени суток / даты: пока строка даты привязана к обновленной строке времени, она работает как простая функция TOD. Вы можете расширить строку до даты и времени.
Является ли его лексикографическая упорядоченность или хронологический порядок сравнения, пока строка представляет собой точку во времени, строка будет также.
Кто-то любезно предложил эту ссылку:
Comments