Перехват KeyboardInterrupt в Python во время завершения работы программы

Я пишу утилиту командной строки на Python, которая, поскольку она является рабочим кодом, должна иметь возможность корректно завершать работу, не выводя кучу вещей (коды ошибок, следы стека и т. Д.) На экран. Это означает, что мне нужно ловить прерывания клавиатуры.

Я пытался использовать оба блока try catch:

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

и ловит сам сигнал (как вэта почта):

import signal
import sys

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

Оба метода, кажется, работают довольно хорошо при нормальной работе. Однако, если прерывание происходит во время очистки кода в конце приложения, Python, кажется, всегда выводит что-то на экран. Поймать прерывание дает

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

в то время как обработка сигнала дает либо

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

или же

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

Эти ошибки не только уродливы, но и не очень полезны (особенно для конечного пользователя без исходного кода)!

Код очистки для этого приложения довольно большой, поэтому есть реальная вероятность того, что эта проблема будет затронута реальными пользователями. Есть ли способ перехватить или заблокировать этот вывод, или мне просто придется иметь дело с этим?

Ответы на вопрос(2)

Ваш ответ на вопрос