在正在运行的 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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top