Python で強制終了される前に最後の関数を実行するにはどうすればよいですか?

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

質問

実行中の Python スクリプトが他のスクリプトやキーボード割り込みなどによって停止される前に、最後のコマンドを実行する方法はありますか。

役に立ちましたか?

解決

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 の致命的な内部エラーが検出された場合、または次の場合には呼び出されません。 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

それは私自身の答えだったが、私の編集が拒否されたかのように自分の答えを取って、それを修正するための「不明」に謝罪してます。

承認された答えは、セグメンテーションフォルトが発生しますエラーが含まれています。

あなたは、シグナルハンドラで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