2013-07-06 21 views
8

sto cercando di eseguire un ciclo while solo in un tempo definito come questo, ma il loop mentre continua la sua esecuzione anche quando siamo al di sopra del limite definito:esecuzione di un ciclo while tra tempo definito

import datetime 
import time 

now = datetime.datetime.now() 

minute = now.minute 

while minute < 46 : 
    print "test" 
    time.sleep(5) 
    minute = now.minute 

Come può fermare il ciclo una volta superato il limite?

Grazie

+4

'now' è definito fuori da' while' e quindi, sarà un valore costante. – hjpotter92

risposta

8

Non si sta aggiornando il valore di minute all'interno del ciclo correttamente. È necessario ricalcolare il valore di now in loop e quindi assegnare il nuovo now.minute a minute.

while minute < 46 : 
    print "test" 
    time.sleep(5) 
    now = datetime.datetime.now() 
    minute = now.minute 
4

è necessario determinare il tempo di nuovo nel vostro ciclo. La variabile minute è statica, non viene aggiornata per riflettere il tempo di modifica.

Se si desidera ciclo per un certo importo di tempo, iniziare con time.time() invece e quindi calcolare il tempo trascorso:

import time 

start = time.time() 

while time.time() - start < 300: 
    print 'test' 
    time.sleep(5) 

stamperà 'test' ogni 5 secondi per 5 minuti (300 secondi) .

Si può fare lo stesso con gli oggetti datetime, ma la chiamata time.time() è un po 'più semplice con cui lavorare.

Per ciclo fino un certo tempo datetime può essere utilizzato come:

import datetime 

while datetime.datetime.now().minute < 46: 
    print 'test' 
    time.sleep(5) 

Di nuovo, si noti che il ciclo deve chiamare un metodo ogni volta per determinare il tempo attuale.

0

Si sta memorizzando l'ora corrente nella variabile now. Invece si dovrebbe ottenere il tempo corrente all'interno del ciclo ogni volta: proposta

import datetime 
import time 

minute = datetime.datetime.now().minute 

while minute < 46 : 
    print "test" 
    time.sleep(5) 
    minute = datetime.datetime.now().minute 
1

del ciclo dovrebbe essere datetime.datetime.now().minute - minute < 46 e il corpo del ciclo non dovrebbe essere l'aggiornamento minute.