프로그램을 종료하기 전에 작업 수행
당신의 프로그램이 종료되기 전에 실행될 기능이나 무언가를 어떻게 가질 수 있습니까?백그라운드에서 계속 실행되는 스크립트가 있는데 스크립트가 종료되기 전에 파일에 데이터를 저장해야 합니다.이것을 하는 표준적인 방법이 있습니까?
다음을 확인하십시오.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
'programing' 카테고리의 다른 글
DataGrip에서 서버 출력을 설정하는 방법 (0) | 2023.06.29 |
---|---|
파이썬에서 연쇄적인 방법을 끊는 방법은 무엇입니까? (0) | 2023.06.24 |
데이터베이스 및 데이터 파일의 모든 테이블스페이스를 표시하기 위한 쿼리 (0) | 2023.06.24 |
클래스 방법 대 클래스 필드 함수 대 클래스 필드 화살표 함수의 차이점은 무엇입니까? (0) | 2023.06.24 |
ESM(Programmatic Webpack & Jest): '.js' 파일 확장자가 없으면 모듈을 확인할 수 없습니다. (0) | 2023.06.24 |