in

Capturando KeyboardInterrupt en Python durante el cierre del programa

apple touch icon@2

Estoy escribiendo una utilidad de línea de comando en Python que, dado que es un código de producción, debería poder cerrarse limpiamente sin descargar un montón de cosas (códigos de error, rastros de pila, etc.) en la pantalla. Esto significa que necesito detectar las interrupciones del teclado.

Intenté usar un bloque try catch como:

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print 'Interrupted'
        sys.exit(0)

y captando la señal en sí (como en esta publicación):

import signal
import sys

def sigint_handler(signal, frame):
    print 'Interrupted'
    sys.exit(0)
signal.signal(signal.SIGINT, sigint_handler)

Ambos métodos parecen funcionar bastante bien durante el funcionamiento normal. Sin embargo, si la interrupción se produce durante la limpieza del código al final de la aplicación, Python parece que siempre imprime algo en la pantalla. Captar la interrupción da

^CInterrupted
Exception KeyboardInterrupt in <bound method MyClass.__del__ of <path.to.MyClass object at 0x802852b90>> ignored

mientras que el manejo de la señal da

^CInterrupted
Exception SystemExit: 0 in <Finalize object, dead> ignored

o

^CInterrupted
Exception SystemExit: 0 in <bound method MyClass.__del__ of <path.to.MyClass object at 0x802854a90>> ignored

Estos errores no solo son feos, sino que no son muy útiles (especialmente para un usuario final sin código fuente).

El código de limpieza para esta aplicación es bastante grande, por lo que existe una posibilidad decente de que este problema sea afectado por usuarios reales. ¿Hay alguna forma de capturar o bloquear esta salida, o es algo con lo que tendré que lidiar?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

ms project 2013

Tutorial de MS Project

9809e41d08099ac0a9292f376874bad5 1200 80

Guía de creación de personajes de Fallout: New Vegas