Comment exécuter une fonction en Python , à un moment donné?
Par exemple:
run_it_at(func, '2012-07-17 15:50:00')
et il exécutera la fonction func
au 2012-07-17 15:50:00.
J'ai essayé le sched.scheduler , mais cela n'a pas démarré ma fonction.
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, ())
Que puis-je faire?
Lecture des documents depuis http://docs.python.org/py3k/library/sched.html :
En partant de cela, nous devons déterminer un délai (en secondes) ...
from datetime import datetime
now = datetime.now()
Utilisez ensuite datetime.strptime
pour analyser '2012-07-17 15:50:00' (je vous laisse la chaîne de format)
# 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()
Vous pouvez ensuite utiliser delay
pour passer dans un threading.Timer
instance, par exemple:
threading.Timer(delay, self.update).start()
Jetez un oeil à Advanced Python Scheduler, APScheduler: http://packages.python.org/APScheduler/index.html
Ils ont un exemple pour ce cas d'utilisation: 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'])
Voici une mise à jour de la réponse de stephenbez pour la version 3.5 d'APScheduler en utilisant 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()
Cela peut valoir la peine d'installer cette bibliothèque: https://pypi.python.org/pypi/schedule , aide essentiellement à faire tout ce que vous venez de décrire. Voici un exemple:
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)
Je suis tombé sur le même problème: je n'ai pas pu obtenir les événements de temps absolu enregistrés avec sched.enterabs
Pour être reconnus par sched.run
. sched.enter
A fonctionné pour moi si j'ai calculé un delay
, mais il est difficile à utiliser car je souhaite que les travaux s'exécutent à des heures spécifiques de la journée dans des fuseaux horaires particuliers.
Dans mon cas, j'ai constaté que le problème était que le timefunc
par défaut dans l'initialiseur sched.scheduler
N'est pas time.time
(Comme dans le exemple ), mais plutôt time.monotonic
. time.monotonic
N'a aucun sens pour les horaires "absolus" car, d'après docs , "Le point de référence de la valeur retournée n'est pas défini, de sorte que seule la différence entre les résultats de les appels consécutifs sont valides. "
La solution pour moi était d'initialiser le planificateur comme
scheduler = sched.scheduler(time.time, time.sleep)
Il n'est pas clair si votre time_module.time est réellement time.time ou time.monotonic, mais cela fonctionne très bien lorsque je l'initialise correctement.
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
Recherche d'un déclencheur d'événement Heure/Jour: tant que la "chaîne" de date est liée à une chaîne "d'heure" mise à jour, elle fonctionne comme une simple fonction TOD. Vous pouvez étendre la chaîne à une date et une heure.
que ce soit son ordre lexicographique ou sa comparaison chronologique, tant que la chaîne représente un point dans le temps, la chaîne le sera aussi.
quelqu'un a gentiment offert ce lien: