2011-12-06 6 views
6

Sto lavorando a uno script python che deve essere eseguito tra due date. Sono obbligato ad usare la build nel modulo sched in quanto questo script deve essere in grado di essere eseguito direttamente su qualsiasi macchina che abbia python 2.7 per ridurre i tempi di configurazione. (SO CRON non è un'opzione)Utilizzare il modulo di pianificazione per l'esecuzione in un dato momento

alcune variabili definiscono le impostazioni per il tempo di correre, qui set_timer_start=0600 e set_timer_end=0900 sono scritti in HHMM. Sono in grado di fermare la sceneggiatura al momento giusto.

Non so esattamente come funziona sched (la pagina del documento python non ha molto senso per me), ma per quanto ne so Funziona ad una data/ora (epoca) mentre lo voglio solo per eseguire in un dato momento (HHMM).

Qualcuno può darmi un esempio (o collegamento) su come utilizzare lo schedulatore e forse calcolare la data/ora di esecuzione successiva?

risposta

9

Se ho soddisfatto le tue esigenze, quello che ti serve è probabilmente un ciclo, che reinserirà un compito in coda ogni volta che verrà eseguito. Qualcosa sulla falsariga di:

# 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 

Tuttavia, l'utilizzo dello scheduler è - IMO - overkilling. L'utilizzo di oggetti datetime potrebbe essere sufficiente, ad esempio l'implementazione di base potrebbe essere:

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

hai appena fatto la mia giornata, userò la seconda soluzione in quanto è la più semplice, mantenendo la prima come backup (nel caso il mio capo abbia altri piani) – HTDutchy

+3

@ s4uadmin - Felice è stato utile per te. Tieni presente che la mia è un'implementazione ** molto semplice ** che fallirebbe ad esempio se inserisci cose come start = 23, stop = 01 e non considera i minuti. Comunque dovrebbe essere banale migliorarlo sostituendo il 'if x in range' con una funzione' func (x) 'che restituirà' True' o 'False' in base alle tue esigenze. :) – mac

Problemi correlati