real - matplotlib python
Python-Comience una funciĆ³n en el momento dado (5)
¿Cómo puedo ejecutar una función en Python , en un momento dado?
Por ejemplo:
run_it_at(func, ''2012-07-17 15:50:00'')
y ejecutará la función func
en 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, ())
¿Que puedo hacer?
Leer los documentos de http://docs.python.org/py3k/library/sched.html :
Pasando de eso tenemos que calcular un retraso (en segundos) ...
from datetime import datetime
now = datetime.now()
Luego usa datetime.strptime
para analizar ''2012-07-17 15:50:00'' (te dejaré la cadena de formato)
# 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 la delay
para pasar a un threading.Timer
Instancia de threading.Timer
, por ejemplo:
threading.Timer(delay, self.update).start()
Eche un vistazo al Programador Avanzado de Python, APScheduler: http://packages.python.org/APScheduler/index.html
Tienen un ejemplo solo para este 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''])
Me encontré con el mismo problema: no pude obtener eventos de tiempo absoluto registrados con sched.enterabs
para ser reconocidos por sched.run
. sched.enter
funcionó para mí si sched.enter
una delay
, pero es difícil de usar porque quiero que los trabajos se ejecuten a horas específicas del día en husos horarios específicos.
En mi caso, encontré que el problema era que el timefunc
predeterminado en el inicializador time.time
no es time.time
(como en el ejemplo ), sino que es time.monotonic
. time.monotonic
no tiene ningún sentido para los horarios "absolutos" ya que, desde los documentos , "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 inicializar el programador 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 lo inicializo correctamente.
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
Solo estoy buscando un disparador de evento Hora del día / Fecha: siempre que la fecha "cadena" esté ligada a una cadena de "hora" actualizada, funciona como una función TOD simple. Puede extender la cadena a una fecha y hora.
ya sea una ordenación lexicográfica o una comparación de orden cronológico, siempre que la cuerda represente un punto en el tiempo, la cuerda también lo hará.
alguien amablemente ofreció este enlace:
Puede valer la pena instalar esta biblioteca: https://pypi.python.org/pypi/schedule , básicamente ayuda a hacer todo lo que acaba 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)