如何在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)
不隶属于 StackOverflow