Comandos de saída do Python - por que tantos e quando cada um deve ser usado?
489
Parece que o python suporta muitos comandos diferentes para interromper a execução do script. As escolhas que eu encontrei são: quit(), exit(), sys.exit(),os._exit()
Perdi algum? Qual a diferença entre eles? Quando você usaria cada um?
Além disso, se você imprimi-lo, será exibida uma mensagem:
>>>print(quit)Use quit()orCtrl-Z plus Return to exit>>>
Essa funcionalidade foi incluída para ajudar pessoas que não conhecem o Python. Afinal, uma das coisas mais prováveis que um novato tentará sair do Python está digitando quit.
No entanto, nãoquit deve ser usado no código de produção. Isso ocorre porque ele só funciona se o módulo estiver carregado. Em vez disso, essa função deve ser usada apenas no intérprete.site
exit()é um alias para quit(ou vice-versa). Eles existem juntos simplesmente para tornar o Python mais fácil de usar.
Além disso, também fornece uma mensagem quando impressa:
>>>print(exit)Use exit()orCtrl-Z plus Return to exit>>>
No entanto, como quit, exité considerado ruim para usar no código de produção e deve ser reservado para uso no intérprete. Isso ocorre porque ele também depende do sitemódulo.
sys.exit()também gera a SystemExitexceção. Isso significa que é o mesmo quite a exitesse respeito.
Ao contrário dos dois, no entanto, sys.exité considerado bom usar no código de produção. Isso ocorre porque o sysmódulo sempre estará lá.
os._exit()sai do programa sem chamar manipuladores de limpeza, rubor buffers stdio, etc . Portanto, não é uma maneira padrão de sair e deve ser usada apenas em casos especiais. O mais comum deles está no (s) processo (s) filho (s) criado por os.fork.
Observe que, dos quatro métodos dados, apenas este é único no que faz.
Resumindo, todos os quatro métodos saem do programa. No entanto, os dois primeiros são considerados ruins para uso no código de produção e o último é uma maneira suja e não-padrão que é usada apenas em cenários especiais. Então, se você quiser sair de um programa normalmente, ir com o terceiro método: sys.exit.
Ou, melhor ainda, na minha opinião, você pode simplesmente fazer diretamente o que sys.exitfaz nos bastidores e executar:
raiseSystemExit
Dessa forma, você não precisa importar sysprimeiro.
No entanto, essa escolha é simplesmente uma opção de estilo e depende exclusivamente de você.
Mas no shell ipython quite exitsaia do shell enquanto sys.exitnão estiver .
25416 Lee
5
sys.exit()não é uma maneira confiável de fechar. Se for chamado dentro de um segmento, ele encerrará apenas esse segmento, a menos que esteja no segmento principal. Isso pode levar a muitos casos em que o programa continua porque a chamada não estava no encadeamento principal, principalmente porque alguns intérpretes encadearão invisivelmente as chamadas.
Elliot
1
Eu voto para adicionar um endcomando que seria raise SystemExit. Não perceba por que não pode haver algo simples assim, como no BASIC.
Brian Burns
6
@BrianBurns: Não vale a pena adicionar sintaxe dedicada e reservar outra palavra-chave. Isso é semelhante ao motivo pelo qual printfoi alterado de uma instrução para uma função. É fácil adicionar sintaxe, mas há um custo de complexidade para fazer isso.
User2357112 suporta Monica
1
Os parênteses são importantes ao ligar sys.exit()?
Lindhe
100
As funções *quit() , exit()e sys.exit()funcionam da mesma maneira: eles levantam a SystemExitexceção. Portanto, não há diferença real, exceto que sys.exit()está sempre disponível, mas exit()e quit()só estão disponíveis se o sitemódulo é importado.
A os._exit()função é especial, sai imediatamente sem chamar nenhuma função de limpeza (não libera buffers, por exemplo). Isso foi desenvolvido para casos de uso altamente especializados ... basicamente, apenas na criança após uma os.fork()chamada.
Conclusão
Use exit()ou quit()no REPL.
Use sys.exit()em scripts ou raise SystemExit()se preferir.
Use os._exit()para processos filhos para sair após uma chamada para os.fork().
Tudo isso pode ser chamado sem argumentos, ou você pode especificar o status de saída, por exemplo, exit(1)ou raise SystemExit(1)para sair com o status 1. Observe que os programas portáteis são limitados a códigos de status de saída no intervalo de 0 a 255, se você raise SystemExit(256)em muitos sistemas ficar truncado e seu processo realmente sairá com o status 0.
Notas de rodapé
* Na verdade, quit()e exit()são objetos de instância que podem ser chamados, mas acho que é bom chamá-los de funções.
Internamente sys.exitapenas aumenta SystemExit. No entanto, chamar sys.exité mais idiomático do que aumentar SystemExitdiretamente.
os.exit é uma chamada de sistema de baixo nível que sai diretamente sem chamar nenhum manipulador de limpeza.
quite exitexiste apenas para fornecer uma maneira fácil de sair do prompt do Python. Isso é para novos usuários ou usuários que entraram acidentalmente no prompt do Python e não querem saber a sintaxe correta. É provável que eles tentem digitar exitou quit. Embora isso não saia do intérprete, ele pelo menos emite uma mensagem que indica uma saída:
>>> exitUse exit()orCtrl-D (i.e. EOF) to exit>>> exit()
$
Isso é essencialmente apenas um truque que utiliza o fato de que o intérprete imprime o __repr__de qualquer expressão que você digitar no prompt.
os.abort()
Respostas:
Deixe-me dar algumas informações sobre eles:
quit()
simplesmente gera aSystemExit
exceção.Além disso, se você imprimi-lo, será exibida uma mensagem:
Essa funcionalidade foi incluída para ajudar pessoas que não conhecem o Python. Afinal, uma das coisas mais prováveis que um novato tentará sair do Python está digitando
quit
.No entanto, não
quit
deve ser usado no código de produção. Isso ocorre porque ele só funciona se o módulo estiver carregado. Em vez disso, essa função deve ser usada apenas no intérprete.site
exit()
é um alias paraquit
(ou vice-versa). Eles existem juntos simplesmente para tornar o Python mais fácil de usar.Além disso, também fornece uma mensagem quando impressa:
No entanto, como
quit
,exit
é considerado ruim para usar no código de produção e deve ser reservado para uso no intérprete. Isso ocorre porque ele também depende dosite
módulo.sys.exit()
também gera aSystemExit
exceção. Isso significa que é o mesmoquit
e aexit
esse respeito.Ao contrário dos dois, no entanto,
sys.exit
é considerado bom usar no código de produção. Isso ocorre porque osys
módulo sempre estará lá.os._exit()
sai do programa sem chamar manipuladores de limpeza, rubor buffers stdio, etc . Portanto, não é uma maneira padrão de sair e deve ser usada apenas em casos especiais. O mais comum deles está no (s) processo (s) filho (s) criado poros.fork
.Observe que, dos quatro métodos dados, apenas este é único no que faz.
Resumindo, todos os quatro métodos saem do programa. No entanto, os dois primeiros são considerados ruins para uso no código de produção e o último é uma maneira suja e não-padrão que é usada apenas em cenários especiais. Então, se você quiser sair de um programa normalmente, ir com o terceiro método:
sys.exit
.Ou, melhor ainda, na minha opinião, você pode simplesmente fazer diretamente o que
sys.exit
faz nos bastidores e executar:Dessa forma, você não precisa importar
sys
primeiro.No entanto, essa escolha é simplesmente uma opção de estilo e depende exclusivamente de você.
fonte
quit
eexit
saia do shell enquantosys.exit
não estiver .sys.exit()
não é uma maneira confiável de fechar. Se for chamado dentro de um segmento, ele encerrará apenas esse segmento, a menos que esteja no segmento principal. Isso pode levar a muitos casos em que o programa continua porque a chamada não estava no encadeamento principal, principalmente porque alguns intérpretes encadearão invisivelmente as chamadas.end
comando que seriaraise SystemExit
. Não perceba por que não pode haver algo simples assim, como no BASIC.print
foi alterado de uma instrução para uma função. É fácil adicionar sintaxe, mas há um custo de complexidade para fazer isso.sys.exit()
?As funções *
quit()
,exit()
esys.exit()
funcionam da mesma maneira: eles levantam aSystemExit
exceção. Portanto, não há diferença real, exceto quesys.exit()
está sempre disponível, masexit()
equit()
só estão disponíveis se osite
módulo é importado.A
os._exit()
função é especial, sai imediatamente sem chamar nenhuma função de limpeza (não libera buffers, por exemplo). Isso foi desenvolvido para casos de uso altamente especializados ... basicamente, apenas na criança após umaos.fork()
chamada.Conclusão
Use
exit()
ouquit()
no REPL.Use
sys.exit()
em scripts ouraise SystemExit()
se preferir.Use
os._exit()
para processos filhos para sair após uma chamada paraos.fork()
.Tudo isso pode ser chamado sem argumentos, ou você pode especificar o status de saída, por exemplo,
exit(1)
ouraise SystemExit(1)
para sair com o status 1. Observe que os programas portáteis são limitados a códigos de status de saída no intervalo de 0 a 255, se vocêraise SystemExit(256)
em muitos sistemas ficar truncado e seu processo realmente sairá com o status 0.Notas de rodapé
* Na verdade,
quit()
eexit()
são objetos de instância que podem ser chamados, mas acho que é bom chamá-los de funções.fonte
Diferentes meios de saída
os._exit()
:exit(0)
:exit(1)
:sys.exit()
:quit()
:Sumário
Basicamente, todos eles fazem a mesma coisa, no entanto, também depende do que você está fazendo.
Eu não acho que você deixou nada de fora e eu recomendaria se acostumar com
quit()
ouexit()
.Você usaria
sys.exit()
eos._exit()
principalmente se estiver usando arquivos grandes ou usando python para controlar o terminal.Caso contrário, use principalmente
exit()
ouquit()
.fonte
sys.exit
é a maneira canônica de sair.Internamente
sys.exit
apenas aumentaSystemExit
. No entanto, chamarsys.exit
é mais idiomático do que aumentarSystemExit
diretamente.os.exit
é uma chamada de sistema de baixo nível que sai diretamente sem chamar nenhum manipulador de limpeza.quit
eexit
existe apenas para fornecer uma maneira fácil de sair do prompt do Python. Isso é para novos usuários ou usuários que entraram acidentalmente no prompt do Python e não querem saber a sintaxe correta. É provável que eles tentem digitarexit
ouquit
. Embora isso não saia do intérprete, ele pelo menos emite uma mensagem que indica uma saída:Isso é essencialmente apenas um truque que utiliza o fato de que o intérprete imprime o
__repr__
de qualquer expressão que você digitar no prompt.fonte