파이썬에서 죽이기 전에 마지막 기능을 실행하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/930519

문제

실행중인 파이썬 스크립트가 다른 스크립트, 키보드 인터럽트 등으로 죽임으로써 중지되기 전에 마지막 명령을 실행할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top