実行中のPythonスクリプトが他のスクリプトやキーボード割り込みなどによって強制終了される前に、最後のコマンドを実行する方法はありますか.
29908 次
5 に答える
43
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)
于 2009-05-30T20:29:50.813 に答える
13
モジュールを使用でき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()
は呼び出されません。
そのため、シグナルハンドラーも登録することをお勧めします。
于 2009-05-30T20:32:14.617 に答える
10
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
于 2009-05-30T20:24:34.257 に答える
6
atexitモジュールを使用して、最後に呼び出される関数を登録します。
import atexit
atexit.register(some_function)
于 2009-05-30T20:32:20.683 に答える