Подтвердить что ты не робот

Как запустить одну последнюю функцию перед тем, как ее убить на Python?

Есть ли способ запустить одну последнюю команду до того, как запущенный Python script будет остановлен, будучи убитым каким-либо другим script, прерыванием клавиатуры и т.д.

4b9b3361

Ответ 1

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)

Ответ 2

Я думаю, что вы можете использовать модуль 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)

Вы также можете передавать параметры позиционного и ключевого слова функции, которую вы хотите вызвать при завершении программы.

Ответ 3

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

Ответ 4

Приносим извинения "Неизвестному" за ответ и исправление его, как если бы это был мой собственный ответ, но мои изменения были отклонены.

Утвержденный ответ содержит ошибку, которая вызовет segfault.

Вы не можете использовать 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)

SIGBREAK может использоваться, если целевой платформой является Windows.

В зависимости от варианта использования и необходимости очистки в случае фатальных ошибок вы можете добавить SIGSEGV и SIGILL, но обычно это не рекомендуется, так как состояние программы может быть таким, что вы создаете бесконечный цикл.

Ответ 5

Используйте модуль atexit для регистрации функции, которая будет вызываться в конце.

import atexit
atexit.register(some_function)