Перехват 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  ignored

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

^CInterrupted
Exception SystemExit: 0 in  ignored

или же

^CInterrupted
Exception SystemExit: 0 in  ignored

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

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

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

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