[Python: Tutorial] Como executar funções ao fechar o script.

Neste tutorial, vou ensinar duas formas de disparar uma função quando o script for encerrado. Ele será executado quando o script chegar ao seu final natural ou quando a execução dele for interrompida por um erro. 

O objetivo deste tutorial é executar a função abaixo sempre que o script terminar:

Obviamente, você vai criar uma utilidade melhor que apenas dar print em uma linha, mas ela vai servir de exemplo.

A primeira forma de se fazer isso e a que funciona em caso de erros de execução (exceptions) é utilizando o try/catch:

No exemplo acima, se você utilizar o atalho para cancelar a execução (CTRL+C), ele vai ‘pular o fonte’ e executar o que está dentro do finally. Caso você utilize ‘ex‘ como input, ele vai disparar (raise) uma exception e isso vai executar o que está no except primeiro e depois o que está no finally.

Abaixo é o log da execução deste arquivo, apenas apertando ENTER quando ele pedir um input:

Agora utilizando CTRL+C para interromper:

Perceba que, logo após o comando (^C), a função foi executada e a frase “He’s dead, Jim!” foi exibida na tela.

O último deste script é utilizando ex como input:

Qual a vantagem desta abordagem? Ela é bem flexível e permite maior controle sobre o fluxo do script. Todavia, se o usuário fechar o terminal onde o script está rodando, ele não vai executar a função run_on_exit (que criamos no inicio deste tutorial).

Para resolver este ponto, podemos utilizar o módulo atexit. Primeiro, precisamos importá-lo:

O próximo passo é registrar qual função será chamada quando o script estiver fechando:

Antigamente, este comando funcionava com qualquer sinal (signal), ou seja, com SIGTERM, SIGINT, SIGQUIT ou SIGABRT. Atualmente, ele só vai ser executado se o sinal for SIGTERM ou se for a finalização normal do script. Esta mudança foi feita, pois utilizar todos os sinais não era (exatamente) uma boa ideia.

Estes sinais (signal) são parte de um módulo específico, chamado signal e sinalizam determinados eventos durante a execução. Para utiliza-los, você precisa importar o módulo.
Exemplo:
import signal
atexit.register(run_on_exit, signal.SIGTERM)

Resumindo: Antigamente (até Python 2.4 +-), você conseguia executar scripts quando o usuário fechava o terminal, mas agora (infelizmente) isso não é mais possível.

Voltando ao tópico deste tutorial, podemos utilizar o script abaixo para testar o atexit:

Executando ele e apertando ENTER na hora do input:

A outra forma seria utilizando CTRL+C para interromper:

Percebe-se uma diferença na utilização destas duas abordagens, mas ambas funcionam. Inclusive, para conseguirmos maior flexibilidade, podemos misturar as duas abordagens.

Se quiser o fonte, ele está no nosso GitHub.

 

Espero ter ajudado.

The following two tabs change content below.
Breno RdV
Ex-Psicólogo, com quase uma década de experiência em Recursos Humanos e Gestão de Pessoas, atual desenvolvedor e Analista de Sistemas, trabalhando com PowerBuilder, C#, PowerShell e expandindo horizontes para Python, Xamarin, PHP, Angular e (por que não?) Unity.

Comments

comments

Posted in Dev, Python and tagged , , , , , .