Não tenho certeza. No Unix / Linux, o padrão é: exit 0, no caso de que tudo estivesse bem. Digite um comando e ecoe $ ?: se você ler 0, ele retornou sem erro. A idéia é ter testes padrão. Se o código xyz.py não encontrou nenhum erro, DEVE retornar 0!
Bruno von Paris
1
Se você deseja alterar o código de saída, prefira sair de forma limpa usando a saída incorporada, veja esta resposta
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 "terminação bem-sucedida" e qualquer valor diferente de zero é considerado "terminação anormal" por conchas e similares. A maioria dos sistemas exige que ela 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.
Um exemplo em que os códigos de saída são usados estão nos scripts de shell. No bash, você pode verificar a variável especial $?para o último status de saída:
Pessoalmente, tento usar os códigos de saída que encontro /usr/include/asm-generic/errno.h(em um sistema Linux), mas não sei se é a coisa certa a fazer.
errno.h é normalmente para códigos de saída de chamada de função. Tentativas de padronizar os códigos de saída do programa resultaram na presença de /usr/include/sysexits.h na maioria dos sistemas POSIX.
mpounsett
1
É muito bom saber que "os programas Unix geralmente usam 2 para erros de sintaxe na linha de comando"!
dantiston
2
@dantiston Concur. Defensor do Gentoo duro e tingido de lã, mas eu nunca soube disso ... até este dia de destino. ( Minha vergonha termina agora. ) De maneira semelhante, observe que grepquebra essa tendência saindo com 1quando nenhuma linha corresponde e 2com erros reais. Muito obrigado, Stallman.
perfil completo de Cecil Curry
32
Para o registro, você pode usar os códigos de saída padrão POSIX definidos aqui .
Exemplo:
import sys, os
try:
config()except:
sys.exit(os.EX_CONFIG)try:
do_stuff()except:
sys.exit(os.EX_SOFTWARE)
sys.exit(os.EX_OK)# code 0, all ok
Isto está incorreto. Esses errno não devem ser usados como códigos de saída do processo. Estes são códigos de erro de baixo nível destinados a serem utilizados internamente em programas, especificamente aqueles escritos na linguagem C. Para Python, use exceções sempre que possível.
SvdB 08/08
2
Você está certo. Estes devem ser usados internamente. Mas você normalmente não gera exceções no nível do usuário final. Você usa sys.exit (x) com x sendo um número inteiro que você escolhe arbitrariamente. Mas você pode usar aqueles que começam com EX_ e definidos no módulo 'os'. Como os.EX_OK ou os.EX_IOERR
Oli
2
Desculpe, mas também estou fazendo uma votação negativa porque é enganosa. Os códigos de status de saída e os números de erro não são intercambiáveis / complementares. Usando o exemplo dado, “permissão negada” tem um código de erro de 13 (de acordo com errnoe errno.h ), mas um código de status de saída de 77 (de acordo com ose sysexits.h ). Os programas que emitem o primeiro não são padrão ( de fato vel jure ) e não funcionam bem com outros que esperam o segundo com razão.
Mark G.
14
Os códigos de saída 0 geralmente significam "nada de errado aqui". No entanto, se o programador do script não seguir a convenção, talvez seja necessário consultar a fonte para ver o que isso significa. Normalmente, um valor diferente de zero é retornado como um código de erro.
Apenas para completar, 'Not OK' será impresso se o script Python gerou um erro OU teve um erro de sintaxe.
Shital Shah
5
Os comandos do sistema operacional possuem códigos de saída. Procure códigos de saída do linux para ver algum material sobre isso. O shell usa os códigos de saída para decidir se o programa funcionou, teve problemas ou falhou. Existem alguns esforços para criar códigos de saída padrão (ou pelo menos comumente usados). Veja esta postagem do Advanced Shell Script .
O módulo do site (importado automaticamente durante a inicialização, exceto se a opção de linha de comando -S for fornecida) adiciona várias constantes ao espaço para nome interno. Eles são úteis para o shell do interpretador interativo e não devem ser usados em programas .
Então:
exit (código = Nenhum)
Objetos que, quando impressos, imprimem uma mensagem como “Use quit () ou Ctrl-D (isto é, EOF) para sair” e, quando chamados, aumentam SystemExit com o código de saída especificado.
Se o compararmos com a documentação sys.exit () , ele está usando o mesmo mecanismo que está gerando uma SystemExitexceção.
Os códigos de saída só têm significado conforme atribuído pelo autor do script. A tradição do Unix é que o código de saída 0 significa 'sucesso', qualquer outra coisa é falha. A única maneira de ter certeza do significado dos códigos de saída para um determinado script é examinar o próprio script.
Os códigos de saída em muitas linguagens de programação dependem dos programadores. Portanto, você deve consultar o código-fonte do programa (ou manual). Zero normalmente significa "tudo correu bem".
Seguintes códigos de saída unix 0 - para êxito / OK, 1 - não sucesso / erro. Você pode simplesmente usar exit(0)ou exit(1)ligar sem importar o sysmódulo.
Para permitir que manipuladores de exceção e outras coisas sejam executadas, recomendo um encerramento limpo com o exit(0)built-in, em vez de usar o sys.exit()que encerra o processo abruptamente.
Então, qual é a diferença? De onde vem esta informação? Você quer dizer a execução dos manipuladores "na saída" ou a que exatamente você está se referindo? SystemExitparece aumentar de qualquer maneira.
0xC0000022L
mm, eu confundi com os._exit, os dois parecem aumentar SystemExit.
vidstige
1
Errado: sys.exit()faz desligamento limpa, assim como exit(). Ambos fazem a mesma coisa: criar uma SystemExitexceção. Na verdade, exit()destina-se às sessões interativas, não aos scripts, portanto conceitualmente sys.exit()é o indicado. Você pode estar confuso os._exit(), é o que termina abruptamente.
Respostas:
O que você está procurando no script é chamado
sys.exit()
. O argumento para esse método é retornado ao ambiente como o código de saída.É bem provável que o script nunca chame o método de saída e que 0 seja o código de saída padrão.
fonte
A partir da documentação para
sys.exit
:Um exemplo em que os códigos de saída são usados estão nos scripts de shell. No bash, você pode verificar a variável especial
$?
para o último status de saída:Pessoalmente, tento usar os códigos de saída que encontro
/usr/include/asm-generic/errno.h
(em um sistema Linux), mas não sei se é a coisa certa a fazer.fonte
grep
quebra essa tendência saindo com1
quando nenhuma linha corresponde e2
com erros reais. Muito obrigado, Stallman.Para o registro, você pode usar os códigos de saída padrão POSIX definidos aqui .
Exemplo:
fonte
exitstatus
pacote PyPI.Há um
errno
módulo que define códigos de saída padrão:Por exemplo, a permissão negada é o código de erro 13 :
fonte
errno
e errno.h ), mas um código de status de saída de 77 (de acordo comos
e sysexits.h ). Os programas que emitem o primeiro não são padrão ( de fato vel jure ) e não funcionam bem com outros que esperam o segundo com razão.Os códigos de saída 0 geralmente significam "nada de errado aqui". No entanto, se o programador do script não seguir a convenção, talvez seja necessário consultar a fonte para ver o que isso significa. Normalmente, um valor diferente de zero é retornado como um código de erro.
fonte
A resposta é "Depende do que o código de saída zero significa"
No entanto, na maioria dos casos, isso significa "Está tudo bem"
Eu gosto do POSIX:
Então, no shell, digitei:
python script.py && echo 'OK' || echo 'Not OK'
Se meu script python chamar,
sys.exit(0)
o shell retornará 'OK'Se meu script python chamar
sys.exit(1)
(ou qualquer número inteiro diferente de zero), o shell retornará 'Not OK'É seu trabalho ficar esperto com o shell e ler a documentação (ou a fonte) do seu script para ver o que significam os códigos de saída.
fonte
Os comandos do sistema operacional possuem códigos de saída. Procure códigos de saída do linux para ver algum material sobre isso. O shell usa os códigos de saída para decidir se o programa funcionou, teve problemas ou falhou. Existem alguns esforços para criar códigos de saída padrão (ou pelo menos comumente usados). Veja esta postagem do Advanced Shell Script .
fonte
Não tenho certeza se este é um bom conselho.
A própria documentação mencionada diz:
Então:
Se o compararmos com a documentação sys.exit () , ele está usando o mesmo mecanismo que está gerando uma
SystemExit
exceção.fonte
Se você deseja usar portably os códigos de saída POSIX padrão , consulte o
exitstatus
pacote no PyPI.Instale o pacote:
Use no seu código:
fonte
Os códigos de saída só têm significado conforme atribuído pelo autor do script. A tradição do Unix é que o código de saída 0 significa 'sucesso', qualquer outra coisa é falha. A única maneira de ter certeza do significado dos códigos de saída para um determinado script é examinar o próprio script.
fonte
Os códigos de saída em muitas linguagens de programação dependem dos programadores. Portanto, você deve consultar o código-fonte do programa (ou manual). Zero normalmente significa "tudo correu bem".
fonte
Seguintes códigos de saída unix 0 - para êxito / OK, 1 - não sucesso / erro. Você pode simplesmente usar
exit(0)
ouexit(1)
ligar sem importar osys
módulo.fonte
Para permitir que manipuladores de exceção e outras coisas sejam executadas, recomendo um encerramento limpo com o
exit(0)
built-in, em vez de usar osys.exit()
que encerra o processo abruptamente.fonte
SystemExit
parece aumentar de qualquer maneira.os._exit
, os dois parecem aumentarSystemExit
.sys.exit()
faz desligamento limpa, assim comoexit()
. Ambos fazem a mesma coisa: criar umaSystemExit
exceção. Na verdade,exit()
destina-se às sessões interativas, não aos scripts, portanto conceitualmentesys.exit()
é o indicado. Você pode estar confusoos._exit()
, é o que termina abruptamente.