This document is for an old version of Python that is no longer supported. You should upgrade and read the documentação do Python para versão estável atual.

# 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

Módulo `readline`

  Exemplo útil de `atexit` para ler e escrever arquivos de histórico de `readline`.

## 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 a aplicação 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 reservada 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 decorator de função:

    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.