Códigos de saída em Python

207

Recebi uma mensagem dizendo script xyz.py returned exit code 0. O que isto significa?

O que significam os códigos de saída no Python? Quantos existem? Quais são importantes?

sundeep
fonte
1
Onde você está vendo esta mensagem?
Jeremy Cantrell
1
@ Jeremy Na parte inferior do PythonWin.
sundeep

Respostas:

223

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.

Dave Costa
fonte
12
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
vidstige
101

A partir da documentação parasys.exit :

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:

me@mini:~$ python -c ""; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(0)"; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(43)"; echo $?
43

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.

Eigir
fonte
3
Em outro post, encontrei este link: tldp.org/LDP/abs/html/exitcodes.html Pode ser útil. :)
Eigir
9
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
Laffuste
fonte
3
De acordo com os documentos, eles estão disponíveis apenas nos sistemas operacionais Unix, portanto, não são totalmente portáteis.
Phoenix
1
Se você quiser códigos portáteis POSIX disponíveis em todos os sistemas operacionais, consulte o exitstatuspacote PyPI.
Phoenix
1
A totalidade desse pacote é 0 para o sucesso e 1 para falha.
Pavel Minaev 9/09/19
25

Há um errnomódulo que define códigos de saída padrão:

Por exemplo, a permissão negada é o código de erro 13 :

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)
Oli
fonte
36
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.

Sam Corder
fonte
6

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.

FlipMcF
fonte
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 .

S.Lott
fonte
5

Eu recomendo um desligamento limpo com a saída (0) incorporada em vez de usar sys.exit ()

Não tenho certeza se este é um bom conselho.

A própria documentação mencionada diz:

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.

câmara fraca
fonte
5

Se você deseja usar portably os códigos de saída POSIX padrão , consulte o exitstatuspacote no PyPI.

Instale o pacote:

$ pip install exitstatus

Use no seu código:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)
Fénix
fonte
4

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.

Harper Shelby
fonte
2

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".

Davide
fonte
0

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.

Lukasz Dynowski
fonte
-2

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.

vidstige
fonte
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.
MestreLion