web-dev-qa-db-fra.com

Python - Démarrer une fonction à un moment donné

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?

24
microo8

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()
20
Jon Clements

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'])
17
stephenbez

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()
11
user1106278

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)
9
daniel galarza

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.

3
Eric Westphal
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:

Technique de comparaison de chaînes utilisée par Python

1
mAd