Encerrando um script Python
-
09-06-2019 - |
Pergunta
Estou ciente do die()
comando em PHP que interrompe um script antecipadamente.
Como posso fazer isso em Python?
Solução
import sys
sys.exit()
detalhes do sys
documentação do módulo:
sys.saída([argumento])
Saia do Python.Isto é implementado através do aumento do
SystemExit
exceção, portanto, ações de limpeza especificadas por cláusulas finais detry
As declarações são honradas, e é possível interceptar o tentativa de saída em um nível externo.O argumento opcional argumento pode ser um inteiro que dá o status de saída (padrão para zero) ou outro tipo de objeto.Se for um número inteiro, zero é considerado "término bem-sucedido" e qualquer valor diferente de zero é considerado "terminação anormal" por conchas e afins.A maioria dos sistemas exigem que ele esteja na faixa de 0 a 127 e produzam resultados indefinidos caso contrário.Alguns sistemas têm uma convenção para atribuir significados para códigos de saída específicos, mas estes são geralmente subdesenvolvido;Programas Unix geralmente usam 2 para sintaxe de linha de comando erros e 1 para todos os outros tipos de erros.Se outro tipo de objeto é passado, Nenhum é equivalente a passar zero, e qualquer outro objeto é impresso para
stderr
e resulta em um código de saída 1.Em particular,sys.exit("some error message")
é uma maneira rápida de sair de um programa quando Ocorre um erro.Desde
exit()
Por fim, "apenas" levanta uma exceção, ele só sairá do processo quando chamado do thread principal e a exceção não é interceptada.
Observe que esta é a maneira 'legal' de sair.@matriz torcida de glifo abaixo indica que se você deseja uma 'saída forçada', você pode usar os._exit(Erro de código), embora seja provavelmente específico do sistema operacional até certo ponto (pode não receber um código de erro no Windows, por exemplo), e definitivamente é menos amigável, pois não permite que o intérprete faça nenhuma limpeza antes que o processo termine.
Outras dicas
Uma maneira simples de encerrar um script Python antecipadamente é usar a função integrada quit().Não há necessidade de importar nenhuma biblioteca e é eficiente e simples.
Exemplo:
#do stuff
if this == that:
quit()
Outra maneira é:
raise SystemExit
Embora você geralmente deva preferir sys.exit
por ser mais "amigável" com outros códigos, tudo o que ele faz é gerar uma exceção.
Se você tem certeza de que precisa sair de um processo imediatamente e pode estar dentro de algum manipulador de exceções que capturaria SystemExit
, há outra função - os._exit
- que termina imediatamente no nível C e não realiza nenhuma das desmontagens normais do intérprete;por exemplo, ganchos registrados no módulo "atexit" não são executados.
Você também pode usar simplesmente exit()
.
Tenha em mente que sys.exit()
, exit()
, quit()
, e os._exit(0)
matar o interpretador Python.Portanto, se aparecer em um script chamado de outro script por execfile()
, ele interrompe a execução de ambos os scripts.
Ver "Pare a execução de um script chamado com execfile"para evitar isso.
from sys import exit
exit()
Como parâmetro você pode passar um código de saída, que será retornado ao SO.O padrão é 0.
Acabei de descobrir que, ao escrever um aplicativo multithread, raise SystemExit
e sys.exit()
ambos matam apenas o thread em execução.Por outro lado, os._exit()
sai de todo o processo.Isso foi discutido aqui.
O exemplo abaixo possui 2 threads.Kenny e Cartman.Supõe-se que Cartman viva para sempre, mas Kenny é chamado recursivamente e deve morrer após 3 segundos.(chamada recursiva não é a melhor maneira, mas tive outros motivos)
Se também quisermos que Cartman morra quando Kenny morrer, Kenny deveria ir embora com os._exit
, caso contrário, apenas Kenny morrerá e Cartman viverá para sempre.
import threading
import time
import sys
import os
def kenny(num=0):
if num > 3:
# print("Kenny dies now...")
# raise SystemExit #Kenny will die, but Cartman will live forever
# sys.exit(1) #Same as above
print("Kenny dies and also kills Cartman!")
os._exit(1)
while True:
print("Kenny lives: {0}".format(num))
time.sleep(1)
num += 1
kenny(num)
def cartman():
i = 0
while True:
print("Cartman lives: {0}".format(i))
i += 1
time.sleep(1)
if __name__ == '__main__':
daemon_kenny = threading.Thread(name='kenny', target=kenny)
daemon_cartman = threading.Thread(name='cartman', target=cartman)
daemon_kenny.setDaemon(True)
daemon_cartman.setDaemon(True)
daemon_kenny.start()
daemon_cartman.start()
daemon_kenny.join()
daemon_cartman.join()
Sou totalmente novato, mas certamente isso é mais limpo e controlado
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
return
print 'You wont see this'
if __name__ == '__main__':
main()
...
Programa encerrado
que
import sys
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
sys.exit()
print 'You wont see this'
if __name__ == '__main__':
main()
...
Programa encerrado Traceback (última chamada mais recente):Arquivo "Z:\Directory estdieprogram.py", linha 12, em main() Arquivo "Z:\Directory estdieprogram.py", linha 8, na principal sys.exit() SystemExit
Editar
A questão é que o programa termine de forma suave e pacífica, em vez de "PAREI!!!!"
No Python 3.5, tentei incorporar código semelhante sem o uso de módulos (por exemplosys, Biopy) além do que está integrado para interromper o script e imprimir uma mensagem de erro para meus usuários.Aqui está meu exemplo:
## My example:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
print("Start codon is missing! Check your DNA sequence!");
exit(); ## as most folks said above
Mais tarde, descobri que é mais sucinto apenas gerar um erro:
## My example revised:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
raise ValueError("Start codon is missing! Check your DNA sequence!");