프로그램 종료 전에 작업 수행


101

프로그램이 종료되기 전에 실행될 함수 나 무언가를 어떻게 가질 수 있습니까? 백그라운드에서 지속적으로 실행되는 스크립트가 있으며 종료하기 전에 일부 데이터를 파일에 저장해야합니다. 이를 수행하는 표준 방법이 있습니까?


2
스크립트는 멈추지 않아야하지만 누군가가 프로세스를 종료하거나 Ctrl + \ 또는 기타를 누를 수 있습니다.
— RacecaR 2010 년

답변:


165

atexit모듈을 확인하십시오 .

http://docs.python.org/library/atexit.html

예를 들어 응용 프로그램이 종료 될 때 메시지를 인쇄하려면 다음을 수행합니다.

import atexit

def exit_handler():
    print 'My application is ending!'

atexit.register(exit_handler)

이것은 스크립트의 정상적인 종료에 효과적이지만 모든 경우에 호출되지는 않습니다 (예 : 치명적인 내부 오류).


5
Ctrl + C 또는 Ctrl + \를 누르면 호출 될 위치로 만들 수있는 방법이 있습니까?
— RacecaR 2010 년

8
Ctrl + C를 누르면 호출됩니다. 그것은 단순히 KeyboardInterrupt 예외를 발생시킵니다.
— Ned Batchelder

1
오, 잊어 버렸어요. 그리고 누군가가 파이썬 프로세스를 죽이면 당신이 할 수있는 일이 실행되지 않을 것이라고 가정합니다.
— RacecaR 2010 년

5
@RacecaR : 참으로; 프로세스를 죽이는 요점은 프로세스를 중지하는 것입니다. 문서에서 : Note The exit function is not called when the program is killed by a signal, when a Python fatal internal error is detected, or when os._exit() is called.
— Katriel 2010 년

18
@RacecaR, 프로세스가 심하게 충돌하거나 잔인하게 종료 된 경우에도 종료 코드를 실행할 수있는 유일한 방법 은 "모니터"또는 "워치 독"이라고하는 다른 프로세스에 있습니다. 적절한 경우 종료 코드를 실행하십시오. 물론 이것은 매우 다른 아키텍처를 필요로하며 한계가 있습니다. 이러한 기능이 필요한 경우 문제에 대해 다른 Q를 여는 것이 가장 좋습니다.
— Alex Martelli

32

오류가 발생하더라도 항상 실행되도록하려면 다음 try: finally:과 같이 사용 하십시오.

def main():
    try:
        execute_app()
    finally:
        handle_cleanup()

if __name__=='__main__':
    main()

예외도 처리하려면 except:앞에 삽입 할 수 있습니다 .finally:


14
프로세스 종료로 인해 SIGTERM이 발생하면 작동하지 않습니다.
— ramu

16

a를 발생시켜 KeyboardInterrupt(예 : Ctrl-C를 눌러) 스크립트를 중지하면 표준 예외로 잡을 수 있습니다. SystemExit같은 방법으로 잡을 수도 있습니다 .

try:
    ...
except KeyboardInterrupt:
    # clean up
    raise

나는 당신이 그것에 대해 알기 위해 이것을 언급합니다. 이를 수행하는 '올바른'방법은 atexit위에서 언급 한 모듈입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.