programing

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

javamemo 2023. 6. 24. 08:44
반응형

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

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

다음을 확인하십시오.atexit모듈:

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

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

import atexit

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

atexit.register(exit_handler)

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

오류가 발생한 경우에도 항상 실행할 작업을 원하는 경우try: finally:이런 식으로 -

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

if __name__=='__main__':
    main()

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

스크립트를 중지할 경우KeyboardInterrupt(예: Ctrl-C를 눌러) 표준 예외로 인식할 수 있습니다.당신은 또한 잡을 수 있습니다.SystemExit같은 방법으로

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

나는 단지 당신이 그것에 대해 알기 위해 이것을 언급한다; 이것을 하는 '올바른' 방법은.atexit위에서 언급한 모듈.

이 버전은 다른 답변에서 수정된 버전입니다.우아한 출구, 킬 및 PyCharm 중지 버튼(내가 확인할 수 있는 마지막 것)과 함께 작동해야 합니다(완전하게 테스트되지 않음).

import signal
import atexit


def handle_exit(*args):
    try:
        ... do computation ...
    except BaseException as exception:
        ... handle the exception ...


atexit.register(handle_exit)
signal.signal(signal.SIGTERM, handle_exit)
signal.signal(signal.SIGINT, handle_exit)

프로그램의 전체 수명 동안 존재하는 클래스 개체가 있는 경우 클래스에서 다음 명령을 실행할 수도 있습니다.__del__(self)방법:

class x:
def __init__(self):
    while True:
        print ("running")
        sleep(1)

def __del__(self):
    print("destructuring")


a = x()

이것은 실행이 중단된 경우에도 정상적인 프로그램 종료에서도 작동합니다. 확실히 다음과 같은 예외가 있을 것입니다.

running
running
running
running
running
Traceback (most recent call last):
  File "x.py", line 14, in <module>
    a = x()
  File "x.py", line 8, in __init__
    sleep(1)
KeyboardInterrupt
destructuring

다음 답변을 기반으로 합니다.

import sys
import atexit
import signal

def exit_handler():
    print("Cleaning up")

def kill_handler(*args):
    sys.exit(0)

atexit.register(exit_handler)
signal.signal(signal.SIGINT, kill_handler)
signal.signal(signal.SIGTERM, kill_handler)

# MAIN PROGRAM
# for example just reading from the input:
input("Press enter: ")

언급URL : https://stackoverflow.com/questions/3850261/doing-something-before-program-exit

반응형