Есть ли способ запустить одну последнюю команду до того, как запущенный Python script будет остановлен, будучи убитым каким-либо другим script, прерыванием клавиатуры и т.д.
Как запустить одну последнюю функцию перед тем, как ее убить на Python?
Ответ 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)