30

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

4

5 に答える 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 に答える