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?

Jonathan
fonte
1
Você perdeuos.abort()
The Daleks

Respostas:

765

Deixe-me dar algumas informações sobre eles:

  1. quit()simplesmente gera a SystemExitexceção.

    Além disso, se você imprimi-lo, será exibida uma mensagem:

    >>> print (quit)
    Use quit() or Ctrl-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

  2. 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() or Ctrl-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.

  3. 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á.

  4. 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:

raise SystemExit

Dessa forma, você não precisa importar sysprimeiro.

No entanto, essa escolha é simplesmente uma opção de estilo e depende exclusivamente de você.

mhsmith
fonte
2
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.

Dietrich Epp
fonte
50

Diferentes meios de saída

os._exit():

  • Saia do processo sem chamar os manipuladores de limpeza.

exit(0):

  • uma saída limpa, sem erros / problemas.

exit(1):

  • Houve algum problema / erro / problema e é por isso que o programa está saindo.

sys.exit():

  • Quando o sistema e o python são desligados; significa que menos memória está sendo usada após a execução do programa.

quit():

  • Fecha o arquivo python.

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()ou exit().

Você usaria sys.exit()e os._exit()principalmente se estiver usando arquivos grandes ou usando python para controlar o terminal.

Caso contrário, use principalmente exit()ou quit().

Mike Williamson
fonte
42

sys.exit é a maneira canônica de sair.

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:

>>> exit
Use exit() or Ctrl-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.

oefe
fonte