Python - запуск функции в заданное время
Как я могу запустить функцию в Python в данный момент?
Например:
run_it_at(func, '2012-07-17 15:50:00')
и он запустит функцию func
в 2012-07-17 15:50:00.
Я попробовал sched.scheduler, но он не запустил мою функцию.
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, ())
Что я могу сделать?
Ответы
Ответ 1
Чтение документов из 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()
Ответ 2
Взгляните на Advanced Python Scheduler, APScheduler: http://packages.python.org/APScheduler/index.html
У них есть пример только для этой утилиты:
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
Вот обновление ответа Стивенбеза для версии 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()
Ответ 4
Может быть стоит установить эту библиотеку: 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)
Ответ 5
Я столкнулся с одной и той же проблемой: я не смог получить абсолютные события времени, зарегистрированные с sched.enterabs
для распознавания sched.run
. sched.enter
работал у меня, если я вычислил delay
, но неловко использовать, так как я хочу, чтобы задания выполнялись в определенное время суток в определенных часовых поясах.
В моем случае я обнаружил, что проблема в том, что по умолчанию timefunc
в инициализаторе sched.scheduler
не time.time
(как в примере ), но это time.monotonic
. time.monotonic
не имеет никакого смысла для "абсолютных" расписаний времени, поскольку из docs "Исходная точка возвращаемого значения undefined, так что только разность между результатами последовательных вызовов действительна."
Решение для меня состояло в том, чтобы инициализировать планировщик как
scheduler = sched.scheduler(time.time, time.sleep)
Неясно, является ли ваше time_module.time фактически time.time или time.monotonic, но он отлично работает, когда я его инициализирую правильно.
Ответ 6
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. Вы можете расширить строку до даты и времени.
ли его лексикографическое упорядочение или сравнение хронологического порядка,
пока строка представляет точку во времени, строка тоже будет.
кто-то любезно предложил эту ссылку:
Техника сравнения строк, используемая Python
Ответ 7
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(5).to(10).minutes.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("11:25").do(job)
schedule.every().minute.at(":17").do(job)
while True:
schedule.run_pending()
time.sleep(1)import schedule