from - Script de Python para hacer algo al mismo tiempo todos los días
python modules list (4)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo obtengo un programador tipo Cron en Python? 20 respuestas
Tengo un script python de larga duración que quiero hacer algo a la 01:00 todas las mañanas.
He estado mirando el módulo sched y el objeto Timer pero no veo cómo usarlos para lograrlo.
APScheduler puede ser lo que buscas.
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''])
# The job will be executed on November 6th, 2009 at 16:30:05
job = sched.add_date_job(my_job, datetime(2009, 11, 6, 16, 30, 5), [''text''])
https://apscheduler.readthedocs.io/en/latest/
Puede conseguir que programe otra ejecución incorporándola en la función que está programando.
Necesitaba algo similar para una tarea. Este es el código que escribí: calcula el día siguiente y cambia el tiempo a lo que sea necesario y encuentra segundos entre el tiempo actual y el siguiente horario programado.
import datetime as dt
def my_job():
print "hello world"
nextDay = dt.datetime.now() + dt.timedelta(days=1)
dateString = nextDay.strftime(''%d-%m-%Y'') + " 01-00-00"
newDate = nextDay.strptime(dateString,''%d-%m-%Y %H-%M-%S'')
delay = (newDate - dt.datetime.now()).total_seconds()
Timer(delay,my_job,()).start()
Pasé bastante tiempo buscando lanzar un programa de Python simple a la 01:00. Por alguna razón, no pude hacer que cron lo lanzara y APScheduler parecía bastante complejo para algo que debería ser simple. El horario ( https://pypi.python.org/pypi/schedule ) parecía correcto.
Deberá instalar su biblioteca de Python:
pip install schedule
Esto se modifica desde su programa de ejemplo:
import schedule
import time
def job(t):
print "I''m working...", t
return
schedule.every().day.at("01:00").do(job,''It is 01:00'')
while True:
schedule.run_pending()
time.sleep(60) # wait one minute
Tendrá que poner su propia función en lugar de trabajo y ejecutarla con nohup, por ejemplo:
nohup python2.7 MyScheduledProgram.py &
No olvides volver a iniciarlo si reinicias.
Puedes hacer eso así:
from datetime import datetime
from threading import Timer
x=datetime.today()
y=x.replace(day=x.day+1, hour=1, minute=0, second=0, microsecond=0)
delta_t=y-x
secs=delta_t.seconds+1
def hello_world():
print "hello world"
#...
t = Timer(secs, hello_world)
t.start()
Esto ejecutará una función (por ejemplo, hello_world) el día siguiente a la 1 a.m.