파이썬에서 죽이기 전에 마지막 기능을 실행하는 방법은 무엇입니까?
문제
실행중인 파이썬 스크립트가 다른 스크립트, 키보드 인터럽트 등으로 죽임으로써 중지되기 전에 마지막 명령을 실행할 수있는 방법이 있습니까?
해결책
import time
try:
time.sleep(10)
finally:
print "clean up"
clean up
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
다른 OS 레벨 인터럽트를 잡아야하는 경우 신호 모듈을보십시오.
http://docs.python.org/library/signal.html
신호 예
from signal import *
import sys, time
def clean(*args):
print "clean me"
sys.exit(0)
for sig in (SIGABRT, SIGBREAK, SIGILL, SIGINT, SIGSEGV, SIGTERM):
signal(sig, clean)
time.sleep(10)
다른 팁
당신은 사용할 수 있습니다 atexit
기준 치수. 이를 통해 프로그램 종료시 호출되는 함수를 등록 할 수 있습니다. 여기에서 예제 : http://docs.python.org/library/atexit.html
try:
_count = int(open("/tmp/counter").read())
except IOError:
_count = 0
def incrcounter(n):
global _count
_count = _count + n
def savecounter():
open("/tmp/counter", "w").write("%d" % _count)
import atexit
atexit.register(savecounter)
또한 프로그램 종료시 호출하려는 기능에 위치 및 키워드 매개 변수를 전달할 수도 있습니다.
문서에 핸들러가 호출되지 않는 몇 가지 상황이 있습니다.
메모:이 모듈을 통해 등록 된 기능은 Python에 의해 처리되지 않은 신호, Python 치명적인 내부 오류가 감지 될 때 또는 Python에 의해 처리되지 않는 신호에 의해 프로그램이 죽을 때 호출되지 않습니다.
os._exit()
호출됩니다.
따라서 신호 핸들러를 등록 할 수도 있습니다.
import signal
import sys
import time
def cleanup(*args):
print 'Exiting'
sys.exit(0)
signal.signal(signal.SIGINT, cleanup)
signal.signal(signal.SIGTERM, cleanup)
while True:
time.sleep(60) # less busy loop
대답을 받아들이고 내 자신의 대답 인 것처럼 수정 한 것에 대해 '알 수없는'것에 대해 사과를했지만 내 편집은 거부되었습니다.
승인 된 답변에는 segfault가 발생하는 오류가 포함되어 있습니다.
신호 핸들러에서 sys.exit ()를 사용할 수는 없지만 os._exit을 사용할 수 있으므로 다음과 같습니다.
from signal import *
import os, time
def clean(*args):
print "clean me"
os._exit(0)
for sig in (SIGABRT, SIGINT, SIGTERM):
signal(sig, clean)
time.sleep(10)
대상 플랫폼이 Windows 인 경우 SigBreak를 사용할 수 있습니다.
사용 사례와 치명적인 오류가 발생한 경우 청소가 필요하다는 점에 따라 Sigsegv 및 Sigill을 추가 할 수 있지만 일반적으로 프로그램 상태가 무한 루프를 생성하는 것이기 때문에 권장되지 않습니다.
atexit 모듈을 사용하여 끝에 호출 될 함수를 등록하십시오.
import atexit
atexit.register(some_function)