¿Ejecutar un script de Python durante un tiempo especificado por el usuario?

Lo siento, esta es probablemente una pregunta terrible. Acabo de empezar a aprender python hoy. He estado leyendo un byte de Python. Ahora mismo tengo un proyecto para Python que involucra tiempo. No puedo encontrar nada relacionado con el tiempo en Byte of Python, así que te preguntaré:

¿Cómo puedo ejecutar un bloque por un tiempo especificado por el usuario y luego romperlo?

Por ejemplo (en algún pseudo-código):

time = int(raw_input('Enter the amount of seconds you want to run this: ')) while there is still time left: #run this block 

o mejor:

 import sys time = sys.argv[1] while there is still time left: #run this block 

Gracias por cualquier ayuda. Además, las guías y tutoriales en línea adicionales serían muy apreciados. Realmente me gusta Byte of Python. Sin embargo, sumergirme en Python no puede captar mi atención. Supongo que debería absorberlo y esforzarme más para leerlo.

Recomiendo generar otro hilo , convirtiéndolo en un hilo de demonio , y luego durmiendo hasta que quieras que la tarea muera. Por ejemplo:

 from time import sleep from threading import Thread def some_task(): while True: pass t = Thread(target=some_task) # run the some_task function in another # thread t.daemon = True # Python will exit when the main thread # exits, even if this thread is still # running t.start() snooziness = int(raw_input('Enter the amount of seconds you want to run this: ')) sleep(snooziness) # Since this is the end of the script, Python will now exit. If we # still had any other non-daemon threads running, we wouldn't exit. # However, since our task is a daemon thread, Python will exit even if # it's still going. 

El intérprete de Python se apagará cuando hayan salido todos los subprocesos que no sean daemon. Entonces, cuando su hilo principal se cierre, si el único otro hilo en ejecución es su tarea que está ejecutando en un hilo demonio separado, Python simplemente se cerrará. Esta es una forma conveniente de ejecutar algo en segundo plano si desea poder simplemente dejar de fumar sin preocuparse de que manualmente se cierre y esperar a que se detenga.

En otras palabras, la ventaja que tiene este enfoque sobre el uso de la sleep en un bucle for es que, en ese caso, tiene que codificar su tarea de tal manera que se rompa en partes discretas y luego verifique con frecuencia si es su tiempo. . Lo que podría estar bien para sus propósitos, pero puede tener problemas, como por ejemplo, si cada parte lleva un tiempo considerable, lo que hace que su progtwig se ejecute por mucho más tiempo del que ingresó el usuario, etc. Si este es un problema para usted depende de la tarea que esté escribiendo, pero pensé que mencionaría este enfoque en caso de que fuera mejor para usted.

Try time.time() , que devuelve la hora actual como el número de segundos desde una hora establecida llamada epoch (medianoche del 1 de enero de 1970 para muchas computadoras). Aquí hay una forma de usarlo:

 import time max_time = int(raw_input('Enter the amount of seconds you want to run this: ')) start_time = time.time() # remember when we started while (time.time() - start_time) < max_time: do_stuff() 

Por lo tanto, realizaremos un bucle siempre que el tiempo desde que comenzamos sea menor que el máximo especificado por el usuario. Esto no es perfecto: lo más notable es que si do_stuff() lleva mucho tiempo, no nos detendremos hasta que termine y descubramos que hemos superado nuestra fecha límite. Si necesita poder interrumpir una tarea en curso tan pronto como el tiempo transcurre, el problema se complica.

Si está en Linux y desea interrumpir un proceso de larga ejecución, use la señal :

 import signal, time def got_alarm(signum, frame): print 'Alarm!' # call 'got_alarm' in two seconds: signal.signal(signal.SIGALRM, got_alarm) signal.alarm(2) print 'sleeping...' time.sleep(4) print 'done'