반응형
프로그램 종료 중 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를 무시할 수 있습니다.
반응형
'IT이야기' 카테고리의 다른 글
패키지 내역을 보는 방법 (0) | 2021.05.03 |
---|---|
SSL 핸드 셰이크 디버깅 (0) | 2021.05.02 |
Swift 매개 변수의 기본 키워드 (0) | 2021.05.02 |
console.log.bind (콘솔) (0) | 2021.05.02 |
Immutable.js 레코드에서 한 번에 여러 필드를 설정하는 방법 (0) | 2021.05.02 |