2011-08-16 14 views

Respuesta

20
import sys 
try: 
    # your code 
except KeyboardInterrupt: 
    sys.exit(0) # or 1, or whatever 

es la forma más simple, suponiendo que todavía quiere salir cuando obtener un Ctrl + c.

Si desea trampa sin un try/except, se puede utilizar un recipe like this utilizando el signal module, excepto que no parece funcionar para mí en Windows ..

+0

Es fundamentalmente incorrecto salir con el estado 0 dado que se señala SIGINT. El estado de salida devuelto idealmente debe conservarse, como si la excepción no se detectara. El comentario "o 1" no es lo suficientemente bueno; se espera un ** código de salida de 1 **. –

+0

@ A-B-B se espera un código de salida de 1 si salir del programa con Ctrl-C no es la forma estándar de salir de él sin errores. Si este método de salir representa el éxito, entonces cero es el código de salida esperado. El hecho de que sea una mala idea usar Ctrl-C de esta manera no significa que las personas no lo hagan (y he usado programas que sí lo hacen). – agf

+0

Claro, pero incluir un código de salida de 0 como opción predeterminada en su respuesta todavía parece dudoso. –

1

atraparla con un bloque try/except:

while True: 
    try: 
     print "This will go on forever" 
    except KeyboardInterrupt: 
     pass 
2
try: 
    your_stuff() 
except KeyboardInterrupt: 
    print("no traceback") 
0

También tenga en cuenta que por defecto el intérprete sale con el código de estado 128 + el valor de SIGINT en su plataforma (que es 2 en la mayoría de los sistemas).

import sys, signal 

    try: 
     # code... 
    except KeyboardInterrupt: # Suppress tracebacks on SIGINT 
     sys.exit(128 + signal.SIGINT) # http://tldp.org/LDP/abs/html/exitcodes.html 
+0

Si se cancela el comando de shell 'sleep 10', el código de salida es 130 en mi sistema. Sin embargo, el código de salida para cuando 'KeyboardInterrupt' se genera en Python es simplemente 1. Considere [este error cerrado] (https://bugs.python.org/issue14229). Como tal, creo que la respuesta es inconsistente. –

25

Prueba esto:

import signal 
signal.signal(signal.SIGINT, lambda x,y: sys.exit(0)) 

De esta manera no es necesario para envolver todo en un controlador de excepciones.

+0

Es fundamentalmente incorrecto salir con el estado 0 dado que 'SIGINT' se activa. El estado de salida devuelto idealmente debe conservarse, como si la excepción no se detectara. –

+0

No del todo comprendido lambda; ¿Puedes explicar el uso de "x, y:" aquí en lugar de solo "x:"? – Locane

+0

@Locane es por [este] (https://docs.python.org/3.7/library/signal.html#signal.signal), básicamente, el segundo argumento de signal.signal es una función 'handler' que toma dos parámetros. Para mayor claridad, x y y podrían ser renombrados así 'signal.signal (signal.SIGINT, lambda signal_number, current_stack_frame: sys.exit (0))' – oidualc

-4
import sys 
try: 
    print("HELLO") 
    english = input("Enter your main launguage: ") 
    print("GOODBYE") 
except KeyboardInterrupt: 
    print("GET LOST")