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, ())


Что я могу сделать?

1224   6  

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. Вы можете расширить строку до даты и времени.

Является ли его лексикографическая упорядоченность или хронологический порядок сравнения, пока строка представляет собой точку во времени, строка будет также.

Кто-то любезно предложил эту ссылку:

Метод сравнения строк, используемый Python

Comments

    Ничего не найдено.