28.9. atexit — Manipuladores de Saída

Novo na versão 2.0.

Source code: Lib/atexit.py


The atexit module defines a single function to register cleanup functions. Functions thus registered are automatically executed upon normal interpreter termination. atexit runs these functions in the reverse order in which they were registered; if you register A, B, and C, at interpreter termination time they will be run in the order C, B, A.

Nota: As funções registradas através deste módulo não são invocadas quando o programa é morto por um sinal não tratado pelo Python, quando um erro interno fatal do Python é detectado ou quando a função os._exit() é invocada.

This is an alternate interface to the functionality provided by the sys.exitfunc() variable.

Note: This module is unlikely to work correctly when used with other code that sets sys.exitfunc. In particular, other core Python modules are free to use atexit without the programmer’s knowledge. Authors who use sys.exitfunc should convert their code to use atexit instead. The simplest way to convert code that sets sys.exitfunc is to import atexit and register the function that had been bound to sys.exitfunc.

atexit.register(func[, *args[, **kwargs]])

Registre func como uma função a ser executada no término. Qualquer o argumento opcional que deve ser passado para func for passado como argumento para register(). É possível registrar mais ou menos a mesma função e argumentos.

Na terminação normal do programa (por exemplo, se sys.exit() for chamado ou a execução do módulo principal for concluída), todas as funções registradas serão chamadas por último, pela primeira ordem. A suposição é que os módulos de nível inferior normalmente serão importados antes dos módulos de nível superior e, portanto, devem ser limpos posteriormente.

Se uma exceção é levantada durante a execução dos manipuladores de saída, um traceback é impresso (a menos que SystemExit seja levantado) e as informações de exceção sejam salvas. Depois de todos os manipuladores de saída terem tido a chance de executar a última exceção a ser levantada, é levantada novamente.

Alterado na versão 2.6: This function now returns func, which makes it possible to use it as a decorator.

Ver também

Module readline

Exemplo útil do módulo atexit para ler e escrever no módulo readline os arquivos de histórico.

28.9.1. Exemplo do atexit

O exemplo simples a seguir demonstra como um módulo pode inicializar um contador de um arquivo quando ele é importado e salvar automaticamente o valor atualizado do contador quando o programa termina, sem depender que o aplicativo faça uma chamada explícita nesse módulo na finalização.

try:
    _count = int(open("counter").read())
except IOError:
    _count = 0

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    open("counter", "w").write("%d" % _count)

import atexit
atexit.register(savecounter)

Os argumentos posicional e de palavra-chave também podem ser passados para register() para ser passada para a função registrada quando é chamada

def goodbye(name, adjective):
    print 'Goodbye, %s, it was %s to meet you.' % (name, adjective)

import atexit
atexit.register(goodbye, 'Donny', 'nice')

# or:
atexit.register(goodbye, adjective='nice', name='Donny')

Utilizado como um decorador de função decorator:

import atexit

@atexit.register
def goodbye():
    print "You are now leaving the Python sector."

Isso só funciona com funções que podem ser invocadas sem argumentos.