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


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.