Estou ciente do die()
comando no PHP, que sai de um script mais cedo.
Como posso fazer isso em Python?
fonte
Estou ciente do die()
comando no PHP, que sai de um script mais cedo.
Como posso fazer isso em Python?
import sys
sys.exit()
detalhes da sys
documentação do módulo :
sys.exit([arg])
Saia do Python. Isso é implementado levantando a
SystemExit
exceção, para que as ações de limpeza especificadas por finalmente cláusulas detry
instruções sejam respeitadas e é possível interceptar a tentativa de saída em um nível externo.O argumento opcional arg pode ser um número inteiro que fornece o status de saída (padrão de 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 "término anormal" por shells e similares. A maioria dos sistemas exige que ele esteja no intervalo de 0 a 127 e produza resultados indefinidos. Alguns sistemas têm uma convenção para atribuir significados específicos a códigos de saída específicos, mas geralmente são subdesenvolvidos; Os programas Unix geralmente usam 2 para erros de sintaxe da linha de comando e 1 para todos os outros tipos de erros. Se outro tipo de objeto for passado, Nenhum será equivalente a passar zero, e qualquer outro objeto será impresso
stderr
e resultará 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.Como, no
exit()
final das contas, “only” gera uma exceção, ele somente sai do processo quando chamado a partir do thread principal e a exceção não é interceptada.
Observe que esta é a maneira 'agradável' de sair. O @ glyphtwistedmatrix abaixo indica que, se você quiser uma 'saída definitiva ', poderá usá- os._exit(*errorcode*)
lo, embora seja provável que seja específico do sistema operacional (até certo ponto (talvez não seja necessário 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 acabe.
sys.exit()
, não funciona (não mata o processo, apenas mata o thread) se gerado por um thread em segundo plano?sys.exit()
gera umaSystemExit
exceção no thread atual.UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Uma maneira simples de finalizar um script Python mais cedo é usar a
quit()
função interna. Não há necessidade de importar nenhuma biblioteca, e é eficiente e simples.Exemplo:
fonte
Outra maneira é:
fonte
sys.exit
invólucroVocê também pode usar simplesmente
exit()
.Tenha em mente que
sys.exit()
,exit()
,quit()
, eos._exit(0)
matar o interpretador Python. Portanto, se ele aparecer em um script chamado de outro script porexecfile()
, interrompe a execução dos dois scripts.Consulte " Interromper a execução de um script chamado com execfile " para evitar isso.
fonte
Embora você prefira geralmente
sys.exit
porque é mais "amigável" para outro código, tudo o que realmente 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 seria detectado
SystemExit
, há outra função -os._exit
- que termina imediatamente no nível C e não executa nenhuma das operações normais de remoção. do intérprete; por exemplo, ganchos registrados com o módulo "atexit" não são executados.fonte
Acabei de descobrir que, ao escrever um aplicativo multithread,
raise SystemExit
esys.exit()
ambos matam apenas o thread em execução. Por outro lado,os._exit()
sai de todo o processo. Isso foi discutido em " Por que o sys.exit () não sai quando chamado dentro de um thread no Python? ".O exemplo abaixo tem 2 threads. Kenny e Cartman. Cartman deve viver para sempre, mas Kenny é chamado recursivamente e deve morrer após 3 segundos. (a chamada recursiva não é a melhor maneira, mas eu tinha outros motivos)
Se também queremos que Cartman morra quando Kenny morrer, Kenny deve ir embora
os._exit
, caso contrário, apenas Kenny morrerá e Cartman viverá para sempre.fonte
Como parâmetro, você pode passar um código de saída, que será retornado ao SO. O padrão é 0.
fonte
exit()
esys.exit()
não são a mesma coisa. Não use o built-inexit()
em scripts, este é apenas um ajudante para o shell interativo - usosys.exit()
Eu sou um novato total, mas certamente isso é mais limpo e mais controlado
...
do que
...
Editar
O ponto é que o programa termina sem problemas e de forma pacífica, em vez de "PAREI !!!!"
fonte
return
para finalizar o script. Tudo o quereturn
está fazendo é retornar um valor e um fluxo de controle para a função de chamada. Lá, ele continua com a execução logo após a chamada da função que chamoureturn
. Obviamente, se estareturn
é a última instrução do seu script, como no seu exemplo, o script será encerrado logo após ser chamado.exit
- portanto, os programadores em python podem não perceber tanto o cheiro desse código); e, finalmente, (3) código multiencadeado (que os pythonistas historicamente apenas ignoraram).No Python 3.5, tentei incorporar código semelhante sem o uso de módulos (por exemplo, sys, Biopy) além do que é incorporado para interromper o script e imprimir uma mensagem de erro para meus usuários. Aqui está o meu exemplo:
Mais tarde, achei mais sucinto apenas lançar um erro:
fonte
Meus dois centavos.
Python 3.8.1, Windows 10, 64 bits.
sys.exit()
não funciona diretamente para mim.Eu tenho vários loops próximos.
Primeiro declaro uma variável booleana, a que chamo
immediateExit
.Então, no começo do código do programa eu escrevo:
Então, partindo da exceção de loop mais interna (aninhada), escrevo:
Então eu vou para a continuação imediata do loop externo e, antes de qualquer outra coisa ser executada pelo código, escrevo:
Dependendo da complexidade, algumas vezes a instrução acima precisa ser repetida também nas seções exceto, etc.
A mensagem personalizada também é para minha depuração pessoal, pois os números têm o mesmo objetivo - para ver onde o script realmente sai.
No meu caso particular, estou processando um arquivo CSV, no qual não quero que o software toque, se o software detectar que ele está corrompido. Portanto, para mim, é muito importante sair de todo o script Python imediatamente após detectar a possível corrupção.
E seguindo o sys.exiting gradual de todos os loops que eu consigo fazer.
Código completo: (algumas alterações foram necessárias porque é um código proprietário para tarefas internas):
fonte
except:
sem o tipo de exceção. Se você apenas usarexcept Exception:
(ou mesmo um tipo de exceção mais detalhado, se possível),sys.exit()
ele funcionará conforme o esperado e você não precisará dessa solução alternativa.sys.exit()
é realmente uma espécie de solução de último recurso para erros críticos. Apenas meus dois centavos :)