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