2011-12-06 26 views
6

Estoy trabajando en un script de python que necesita ejecutarse entre dos tiempos determinados. Estoy obligado a utilizar la compilación en el módulo sched ya que esta secuencia de comandos debe poder ejecutarse directamente en cualquier máquina que tenga Python 2.7 para reducir el tiempo de configuración. (SO CRON NO ES UNA OPCIÓN)Usar el módulo sched para ejecutarlo en un momento dado

Algunas variables definen la configuración del tiempo de correr, aquí set_timer_start=0600 y set_timer_end=0900 están escritos en HHMM. Puedo detener el script en el momento correcto.

No sé exactamente cómo funciona sched (la página de Python Doc no tiene mucho sentido para mí), pero por lo que yo entiendo Se ejecuta en una fecha/hora (época) mientras yo solo la quiero para ejecutar en un momento dado (HHMM).

¿Alguien me puede dar un ejemplo (o un enlace) sobre cómo usar el programador y tal vez calcular la próxima fecha/hora de ejecución?

Respuesta

9

Si cumplí con sus requisitos, lo que necesita es probablemente un bucle, que volverá a ingresar una tarea en la cola cada vez que se ejecutará. Algo similar a:

# This code assumes you have created a function called "func" 
# that returns the time at which the next execution should happen. 
s = sched.scheduler(time.time, time.sleep) 
while True: 
    if not s.queue(): # Return True if there are no events scheduled 
     time_next_run = func() 
     s.enterabs(time_next_run, 1, <task_to_schedule_here>, <args_for_the_task>) 
    else: 
     time.sleep(1800) # Minimum interval between task executions 

Sin embargo, utilizando el programador es - IMO - overkilling. Usar objetos de fecha y hora podría ser suficiente, por ejemplo, una implementación básica sería como la siguiente:

from datetime import datetime as dt 
while True: 
    if dt.now().hour in range(start, stop): #start, stop are integers (eg: 6, 9) 
     # call to your scheduled task goes here 
     time.sleep(60) # Minimum interval between task executions 
    else: 
     time.sleep(10) # The else clause is not necessary but would prevent the program to keep the CPU busy. 

HTH!

+0

acaba de hacer mi día, voy a utilizar la segunda solución, ya que es la más fácil, manteniendo la primera como copia de seguridad (en caso de que mi jefe tenga otros planes) – HTDutchy

+3

@ s4uadmin - Feliz fue útil para usted. Tenga en cuenta que la mía es una implementación ** muy básica ** que podría fallar, por ejemplo, si ingresa cosas como start = 23, stop = 01 y no considera los minutos. Sin embargo, debería ser trivial mejorarlo sustituyendo 'if x in range' con una función' func (x) 'que devolverá' True' o 'False' de acuerdo con sus necesidades. :) – mac

Cuestiones relacionadas