2014-06-23 7 views

risposta

45

Prova questo:

import time 

t_end = time.time() + 60 * 15 
while time.time() < t_end: 
    # do whatever you do 

Questo avrà una durata di 15 min x 60 s = 900 secondi.

La funzione time.time restituisce l'ora corrente in secondi dal 1 ° gennaio 1970. Il valore è in virgola mobile, quindi è possibile utilizzarlo anche con precisione inferiore al secondo. All'inizio il valore t_end è calcolato per essere "ora" + 15 minuti. Il ciclo verrà eseguito fino a quando l'ora corrente supera il tempo di fine preimpostato.

+0

Grazie ho provato inizialmente con solo 60 secondi e si è fermato quindi so che 15 minuti funzionerà anche. – oam811

+0

Un'altra domanda: funziona la seguente sintassi? if keys [pygame.K_LEFT]: answer = "left" f = open ("answer.rtf", "a") f.write (risposta) f.close() Non mi permette di aprire dopo il file di testo, mi chiedo se sto facendo qualcosa di sbagliato o se il mio computer sta facendo casino. – oam811

+0

La ricerca di leggere errori di sintassi nel codice è molto difficile dai commenti SO, quindi forse dovresti creare un'altra domanda. Tuttavia, almeno l'operazione if è sbagliata, dovrebbe esserci == invece di =, e il colon dovrebbe essere dopo "left". Se non riesci a farlo funzionare con uno sforzo ragionevole, posta un'altra domanda. (Assicurati di non fare nulla di sbagliato con il rientro.) – DrV

2

Se ho capito, è possibile farlo con un datetime.timedelta -

import datetime 

endTime = datetime.datetime.now() + datetime.timedelta(minutes=15) 
while True: 
    if datetime.datetime.now() >= endTime: 
    break 
    # Blah 
    # Blah 
+1

Grazie, ha funzionato, ma sto usando la risposta di DrV solo perché ha più senso per me. – oam811

+0

@Elliott, C'è qualche ragione per cui non hai usato un confronto now() BobTuckerman

+0

@Bob Per abbinare alla domanda dell'OP. –

-2

provare questo:

import time 
import os 

n = 0 
for x in range(10): #enter your value here 
    print(n) 
    time.sleep(1) #to wait a second 
    os.system('cls') #to clear previous number 
        #use ('clear') if you are using linux or mac! 
    n = n + 1 
0

Semplicemente si può fare

import time 
delay=60*15 ###for 15 minutes delay 
close_time=time.time()+delay 
while True: 
     ##bla bla 
     ###bla bla 
    if time.time()>close_time 
     break 
+0

O anche più semplicemente 'while close_time> time.time():' senza la necessità di 'se time.time()> close_time: break' ... – Fr0zenFyr

0

che cercavo un time-loop più facile da leggere quando ho incontrato questa domanda qui. Qualcosa di simile:

for sec in max_seconds(10): 
     do_something() 

così ho creato questo helper:

# allow easy time-boxing: 'for sec in max_seconds(42): do_something()' 
def max_seconds(max_seconds, *, interval=1): 
    interval = int(interval) 
    start_time = time.time() 
    end_time = start_time + max_seconds 
    yield 0 
    while time.time() < end_time: 
     if interval > 0: 
      next_time = start_time 
      while next_time < time.time(): 
       next_time += interval 
      time.sleep(int(round(next_time - time.time()))) 
     yield int(round(time.time() - start_time)) 
     if int(round(time.time() + interval)) > int(round(end_time)): 
      return 

Funziona solo con secondi pieni che era ok per il mio caso d'uso.

Esempi:

for sec in max_seconds(10) # -> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
for sec in max_seconds(10, interval=3) # -> 0, 3, 6, 9 
for sec in max_seconds(7): sleep(1.5) # -> 0, 2, 4, 6 
for sec in max_seconds(8): sleep(1.5) # -> 0, 2, 4, 6, 8 

essere consapevoli del fatto che l'intervallo non è così precisa, in quanto io aspetto solo pieni secondi (il sonno non era niente di buono per me con tempi < 1 sec). Quindi se il tuo lavoro impiega 500 ms e richiedi un intervallo di 1 secondo, ti chiameremo a: 0, 500ms, 2000ms, 2500ms, 4000ms e così via. Si potrebbe risolvere questo misurando il tempo in un ciclo piuttosto che dormire() ...