Python で強制終了される前に最後の関数を実行するにはどうすればよいですか?
質問
実行中の 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)