如何在Python被终止之前执行最后一个函数?

32 投票
5 回答
33255 浏览
提问于 2025-04-15 11:56

有没有办法在一个正在运行的Python脚本被其他脚本终止、或者被键盘中断之前,执行最后一个命令呢?

5 个回答

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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

14

你可以使用 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() 时。

因此,你可能还想注册一个信号处理器。

45
import time

try:
    time.sleep(10)
finally:
    print "clean up"
    
clean up
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

如果你需要处理其他操作系统级别的中断,可以看看信号模块:

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)

撰写回答