terminar - if en python
Poner fin a un bucle while infinito (3)
Actualmente tengo un código que básicamente ejecuta un bucle infinito mientras recopila datos de los usuarios. Actualización constante de diccionarios / listas en función del contenido de un archivo de texto. Para referencia:
while (True):
IDs2=UpdatePoints(value,IDs2)
time.sleep(10)
Básicamente, mi problema es que no sé cuándo quiero que esto termine, pero después de esto, el bucle se ejecuta. Quiero usar la información recopilada, no perderla al bloquear mi programa. ¿Hay una manera simple y elegante de salir del bucle while cuando quiera? Algo como presionar una cierta tecla en mi teclado sería increíble.
Creo que la solución más fácil sería atrapar el Interruptor de KeyboardInterrupt cuando se presiona la tecla de interrupción , y usarlo para determinar cuándo detener el ciclo.
except KeyboardInterrupt:
break
La desventaja de buscar esta excepción es que puede evitar que el usuario finalice el programa mientras el bucle aún se está ejecutando.
Podrías usar excepciones. Pero solo deberías usar excepciones para cosas que no deben pasar. Así que no para esto.
Es por eso que recomiendo señales:
import sys, signal
def signal_handler(signal, frame):
print("/nprogram exiting gracefully")
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
debe poner esto al principio de su programa y cuando presione ctrl + c en cualquier parte del programa, se cerrará correctamente
Explicación del código:
Importas sys
y signals
. Entonces haces una función que se ejecuta al salir. sys.exit(0)
detiene la programación con el código de salida 0 (el código que dice, todo salió bien).
Cuando el programa obtenga el SIGINT, ya sea por ctrl-c o por un comando kill en el terminal, el programa se cerrará correctamente.
Puede intentar envolver ese código en un bloque try / except, porque las interrupciones del teclado son solo excepciones:
try:
while True:
IDs2=UpdatePoints(value,IDs2)
time.sleep(10)
except KeyboardInterrupt:
print(''interrupted!'')
Luego puede salir del bucle con CTRL-C.