IT이야기

프로그램 종료 중 Python에서 KeyboardInterrupt 잡기

cyworld 2021. 5. 2. 10:58
반응형

프로그램 종료 중 Python에서 KeyboardInterrupt 잡기


나는 파이썬으로 명령 줄 유틸리티를 작성하고 있는데,이 유틸리티는 프로덕션 코드이기 때문에 화면에 많은 물건 (오류 코드, 스택 추적 등)을 덤프하지 않고 깨끗하게 종료 할 수 있어야합니다. 이것은 키보드 인터럽트를 잡아야 함을 의미합니다.

다음과 같이 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

이러한 오류는보기 흉할뿐만 아니라별로 도움이되지 않습니다 (특히 소스 코드가없는 최종 사용자에게는)!

이 응용 프로그램의 정리 코드는 상당히 크기 때문에 실제 사용자가이 문제를 겪을 가능성이 있습니다. 이 출력을 포착하거나 차단할 방법이 있습니까, 아니면 제가 처리해야 할 일입니까?


체크 아웃 이 스레드 , 그것은 종료 및 역 추적에 대한 몇 가지 유용한 정보가 있습니다.

프로그램을 죽이는 데 더 관심이 있다면 다음과 같이 시도해보십시오 (이렇게하면 정리 코드 아래에서도 다리가 제거됩니다).

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

signal.signal(signal.SIGINT, signal.SIG_IGN)정리 코드를 시작하기 전에 호출하여 종료가 시작된 후 SIGINT를 무시할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/21120947/catching-keyboardinterrupt-in-python-during-program-shutdown

반응형