2012-07-17 14 views
9

¿Cómo puedo ejecutar una función en Python, en un momento dado?Python - Inicie una función en el momento dado

Por ejemplo:

run_it_at(func, '2012-07-17 15:50:00') 

y se ejecutará la función func en el 2012-07-17 15:50:00.

Probé el sched.scheduler, pero no inició mi función.

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

¿Qué puedo hacer?

+1

¿Qué sistema operativo? Es probable que deba ejecutarlo con un programa externo a python, como cron en Unix. –

+0

¿Por qué no? ¿Qué retraso configuró para 'enter' (suponiendo que eso es lo que intentó)? –

+0

¿Cómo trataste de usar 'sched.scheduler'? – geoffspear

Respuesta

11

lectura de la documentación de http://docs.python.org/py3k/library/sched.html:

Yendo de que tenemos que llegar a un retardo (en segundos) ...

from datetime import datetime 
now = datetime.now() 

A continuación, utilice datetime.strptime para analizar '2012-07-17 15 : 50: 00' (voy a dejar la cadena de formato para que)

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

a continuación, puede utilizar delay a pasar a una instancia threading.Timer, por ejemplo:

threading.Timer(delay, self.update).start() 
+2

La aritmética de fecha y hora local puede fallar si el desplazamiento utc de la zona horaria local ha cambiado entre 'now' y' run_at', por ejemplo, alrededor de las transiciones DST. Convierta la hora local a UTC o POSIX marca de tiempo para realizar los cálculos. Consulte [Buscar si han pasado 24 horas entre fechas y horas - Python] (http://stackoverflow.com/a/26313848/4279). – jfs

+0

Puede usar 'total_seconds' directamente en' timedelta': 'datetime.timedelta (hours = 3) .total_seconds()' – Spela

13

Tome una mirada en el Programador Python avanzada, APScheduler: http://packages.python.org/APScheduler/index.html

Tienen un ejemplo sólo para este caso de uso: 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']) 
+1

no funciona en python 3 – Anarach

2

me encontré con el mismo problema: lo que pude no obtener eventos de tiempo absoluto registrados con sched.enterabs para ser reconocidos por sched.run. sched.enter funcionó para mí si calculé delay, pero es incómodo de usar porque quiero que los trabajos se ejecuten a horas específicas del día en husos horarios específicos.

En mi caso, he encontrado que el problema fue que el defecto timefunc en el sched.scheduler inicializador no es time.time (como en el example), sino más bien es time.monotonic. time.monotonic no tiene ningún sentido para los horarios "absolutos" ya que, desde el docs, "El punto de referencia del valor devuelto no está definido, por lo que solo es válida la diferencia entre los resultados de las llamadas consecutivas".

La solución para mí fue la de iniciar el planificador como

scheduler = sched.scheduler(time.time, time.sleep)

No está claro si su time_module.time es en realidad time.time o time.monotonic, pero funciona bien cuando inicializar correctamente .

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 

Sólo en busca de una hora del día/Fecha del evento desencadenante: siempre y cuando la fecha de "cadena" está ligado a un "tiempo" actualizado cadena, funciona como una función TOD sencilla. Puede extender la cadena a una fecha y hora.

si su orden lexicográfica o comparación de orden cronológico, , siempre y cuando la cadena representa un punto en el tiempo, la cadena también lo hará.

alguien se ofreció amablemente este enlace:

String Comparison Technique Used by Python

1

podría valer la pena instalar esta biblioteca: https://pypi.python.org/pypi/schedule, básicamente, ayuda a hacer todo lo que acabamos de describir. Aquí hay un ejemplo:

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) 
Cuestiones relacionadas