Pergunta

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

O que os códigos de saída em Python significa? Quantos são? Quais são importantes?

Foi útil?

Solução

O que você está procurando no script é chamadas para sys.exit() . O argumento para esse método é devolvido ao meio ambiente como o código de saída.

É bastante provável que o roteiro nunca é chamado o método de saída, e que 0 é o código de saída padrão.

Outras dicas

A partir a documentação para sys.exit :

O arg argumento opcional pode ser um inteiro dando o status de saída (Calote a zero), ou outro tipo do objecto. Se for um número inteiro, o zero é considerado “termo bem sucedido” e qualquer valor diferente de zero é considerado “Terminação anormal” e por conchas similares. A maioria dos sistemas exigem que ele estar na gama de 0-127, e produtos resultados não definidos de outra forma. Alguns sistemas têm uma convenção para atribuindo significados específicos para Códigos de saída específicos, mas estes são geralmente subdesenvolvidos; Unix programas geralmente usam 2 para o comando linha erros de sintaxe e 1 para todos os outros tipo de erros.

Um exemplo onde códigos de saída são usados ??estão em scripts shell. No bash você pode verificar o $? variável especial para o último estado 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 eu tento usar os códigos de saída I encontrar em /usr/include/asm-generic/errno.h (em um sistema Linux), mas eu não sei se esta é a coisa certa a fazer.

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

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

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)

Para o registro, você pode usar POSIX códigos de saída padrão 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

Os códigos de saída de 0 geralmente média, "nada de errado aqui". No entanto, se o programador do script não seguiu convenção que você pode ter que consultar a fonte para ver o que isso significa. Normalmente, um valor diferente de zero é retornado como um código de erro.

comandos do sistema operacional têm códigos de saída. Procure linux códigos de saída para ver algum material sobre este assunto. O shell usa os códigos de saída para decidir se o programa trabalhou, teve problemas, ou não. Há alguns esforços para criar padrão (ou pelo menos comumente usados) códigos de saída. Veja este avançada Shell Script postagem.

Se você gostaria de usar portably os padrão códigos de saída POSIX , consulte o href="https://pypi.python.org/pypi/exitstatus/" rel="noreferrer"> pacote em PyPI.

Instale o pacote:

pip install exitstatus

Use em seu código:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)

Os códigos de saída só têm significado atribuído pelo autor script. A tradição Unix é que o código de saída 0 significa 'sucesso', outra coisa é o fracasso. A única maneira de ter certeza de que os códigos de saída para uma dada média roteiro é examinar o script em si.

A resposta é "depende do que o código de saída de zero significa"

No entanto, na maioria dos casos, isso significa que "está tudo ok"


Eu gosto de POSIX:

Assim, na casca, eu poderia digitar:

python script.py && echo 'OK' || echo 'Not OK'

Se meus python chamadas de script sys.exit(0) o shell retorna 'OK'

Se o meu script python chama sys.exit(1) (ou qualquer diferente de zero inteiro), o shell retorna 'Not OK'

É o seu trabalho para obter inteligente com o shell, e leia a documentação (ou a fonte) para o seu script para ver o que os códigos de saída dizer.

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

Eu não tenho certeza se este é um bom conselho.

A própria documentação mencionada lê-se:

O módulo site (que é importado automaticamente durante a inicialização, exceto se a opção de linha de comando -S é dado) adiciona várias constantes ao namespace built-in. Eles são úteis para o shell interpretador interativo e não deve ser utilizado em programas .

Depois:

exit (code = None)

Objetos que, quando impresso, imprima uma mensagem como “Use quit () ou Ctrl-D (ou seja EOF) para sair”, e quando chamado, SystemExit aumento com o código de saída especificado.

Se compararmos a sys.exit () documentação, ele está usando o mesmo mecanismo que está levantando uma exceção SystemExit.

Os códigos de saída em muitas linguagens de programação são até programadores. Então você tem que olhar para o seu código fonte do programa (ou manual). Zero normalmente significa "tudo correu bem".

Para permitir manipuladores de exceção e outras coisas executar Eu recomendo um desligamento normal com a exit(0) incorporado em vez de usar sys.exit() que termina o processo de forma abrupta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top