Unk*_*own 33
import time
try:
time.sleep(10)
finally:
print "clean up"
clean up
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
Run Code Online (Sandbox Code Playgroud)
如果需要捕获其他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)
Run Code Online (Sandbox Code Playgroud)
jbr*_*ric 11
你可以使用该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)
Run Code Online (Sandbox Code Playgroud)
您还可以将位置和关键字参数传递给要在程序终止时调用的函数.
请注意,文档中列出了一些不会调用处理程序的情况:
注意:当程序被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
Run Code Online (Sandbox Code Playgroud)
使用 atexit 模块注册一个将在最后调用的函数。
import atexit
atexit.register(some_function)
Run Code Online (Sandbox Code Playgroud)
向'未知'道歉,因为他们回答并纠正它,好像这是我自己的答案,但我的编辑被拒绝了.
批准的答案包含将导致段错误的错误.
你不能在信号处理程序中使用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)
Run Code Online (Sandbox Code Playgroud)
如果目标平台是Windows,则可以使用SIGBREAK.
根据用例和在发生致命错误时需要清理 - 您可以添加SIGSEGV和SIGILL,但通常不建议这样做,因为程序状态可能会导致您创建无限循环.