romper / interrumpir un time.sleep () en python

Necesito salir de time.sleep () usando ctrl c.

While 1: time.sleep(60) 

En el código anterior, cuando el control ingresa en la función time.sleep, deben transcurrir 60 segundos completos para que Python maneje el CTRL C

¿Hay alguna manera elegante de hacerlo? de tal manera que puedo interrumpir incluso cuando el control está en la función time.sleep

editar

Lo estaba probando en una implementación heredada que usa Python 2.2 en Windows 2000, lo que causó todos los problemas. Si hubiera usado una versión superior de python, CTRL C habría interrumpido el modo de suspensión (). Hice un truco rápido llamando a sleep (1) dentro de un bucle for. que temporalmente solucionó mi problema

No estoy seguro de cuál es el sentido de este código, pero si es necesario, use un intervalo de suspensión () más corto y coloque un bucle for a su alrededor:

 for i in range(60): sleep(1) 

Capturar la excepción KeyboardInterrupt utilizando try..except es sencillo

La respuesta correcta es usar los threading.Event Python stdlib. Evento

Seguro que puedes reducir tu intervalo de sueño para que duermas por períodos muy cortos, pero ¿qué pasa si realmente quieres ejecutar tu ciclo una vez cada 60? Entonces necesita hacer más trabajo para determinar si es hora de correr o simplemente seguir durmiendo. Además, todavía estás bloqueando técnicamente pero solo por un corto período de tiempo. Contraste con el threading.Event . threading.Event :

 #!/usr/bin/env python2.7 from threading import Event exit = Event() def main(): while not exit.is_set(): do_my_thing() exit.wait(60) print("All done!") # perform any cleanup here def quit(signo, _frame): print("Interrupted by %d, shutting down" % signo) exit.set() if __name__ == '__main__': import signal for sig in ('TERM', 'HUP', 'INT'): signal.signal(getattr(signal, 'SIG'+sig), quit); main() 

Cuando el controlador de señal llama a exit.set() , la llamada de wait() del hilo principal se interrumpirá de inmediato .

Ahora, podría usar un Event para indicar que hay más trabajo por hacer, etc. Pero en este caso cumple con su doble función como un indicador conveniente de que queremos salir (por ejemplo, la parte while not exit.is_set() ).

También tiene la opción de poner cualquier código de limpieza después de su bucle while.

La excepción KeyboardInterrupt se genera cuando un usuario pulsa la tecla de interrupción, Ctrl-C. En python esto se traduce de una señal SIGINT. Eso significa que puede manejarlo como desee usando el módulo de señal:

 import signal def handler(signum, frame): print "do whatever, like call thread.interrupt_main()" signal.signal(signal.SIGINT, handler) while 1: time.sleep(forever) 

De esa manera, puede hacer lo que quiera al recibir una interrupción del teclado.

Intenté su código con las versiones 2.5, 2.6, 3 de Python en Linux y todos lanzaron la excepción “KeyboardInterrupt” cuando presioné CTRL-C.

Tal vez algún manejo de excepciones atrapa la Interrupción o su problema es así: ¿Por qué KeyboardInterrupt no está funcionando en Python?

La solución más elegante es, sin duda, la de threading.Event . threading.Event , aunque si solo necesitas un truco rápido, este código funciona bien:

 import time def main(): print("It's time !") if __name__ == "__main__": print("press ctrl-c to stop") loop_forever = True while loop_forever: main() try: time.sleep(60) except KeyboardInterrupt: loop_forever = False 

Pensé en tirar esto.

 import time def sleep(seconds): for i in range(seconds): try: time.sleep(1) except KeyboardInterrupt: continue sleep(60)