Pregunta

Recibí un mensaje que decía script xyz.py devolvió el código de salida 0 . ¿Qué significa esto?

¿Qué significan los códigos de salida en Python? ¿Cuántos hay? ¿Cuáles son importantes?

¿Fue útil?

Solución

Lo que está buscando en el script son llamadas a sys.exit () . El argumento de ese método se devuelve al entorno como el código de salida.

Es bastante probable que el script nunca llame al método de salida, y que 0 es el código de salida predeterminado.

Otros consejos

De la documentación de sys.exit :

  

El argumento opcional arg puede ser un   entero que da el estado de salida   (predeterminado a cero) u otro tipo   de objeto. Si es un entero, cero   se considera "terminación exitosa"   y se considera cualquier valor distinto de cero   "Terminación anormal" por proyectiles y   similares. La mayoría de los sistemas requieren que   estar en el rango de 0-127 y producir   resultados indefinidos de lo contrario. Algunos   los sistemas tienen una convención para   asignando significados específicos a   códigos de salida específicos, pero estos son   generalmente subdesarrollado; Unix   los programas generalmente usan 2 para comando   errores de sintaxis de línea y 1 para todos los demás   tipo de errores.

Un ejemplo en el que se usan códigos de salida son los scripts de shell. En bash puede verificar la variable especial $? para el último estado de salida:

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

Personalmente trato de usar los códigos de salida que encuentro en /usr/include/asm-generic/errno.h (en un sistema Linux), pero no sé si este es el lo correcto para hacer.

Hay un errno módulo que define la salida estándar códigos:

Por ejemplo, Permiso denegado es el código de error 13 :

import errno, sys

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

Para el registro, puede usar los códigos de salida estándar POSIX definidos aquí .

Ejemplo:

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

Los códigos de salida de 0 generalmente significan, "no hay nada malo aquí". Sin embargo, si el programador del script no siguió la convención, puede que tenga que consultar la fuente para ver qué significa. Por lo general, se devuelve un valor distinto de cero como código de error.

Los comandos del sistema operativo tienen códigos de salida. Busque códigos de salida de Linux para ver material sobre esto. El shell utiliza los códigos de salida para decidir si el programa funcionó, tuvo problemas o falló. Hay algunos esfuerzos para crear códigos de salida estándar (o al menos de uso común). Vea esta Advanced Shell Script .

Si desea utilizar de forma portátil los códigos de salida POSIX estándar , consulte el paquete exitstatus en PyPI.

Instalar el paquete:

pip install exitstatus

Uso en su código:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)

Los códigos de salida solo tienen el significado asignado por el autor del script. La tradición de Unix es que el código de salida 0 significa 'éxito', cualquier otra cosa es fracaso. La única forma de asegurarse de lo que significan los códigos de salida para un script determinado es examinar el script en sí.

La respuesta es " Depende de lo que signifique el código de salida cero "

Sin embargo, en la mayoría de los casos, esto significa "Todo está bien"


Me gusta POSIX:

Entonces, en el shell, escribiría:

python script.py & amp; & amp; echo 'OK' || echo 'No está bien'

Si mi script de Python llama a sys.exit (0) , el shell devuelve 'OK'

Si mi script de Python llama a sys.exit (1) (o cualquier número entero distinto de cero), el shell devuelve 'No está bien'

Es su trabajo ser inteligente con el shell y leer la documentación (o la fuente) de su script para ver qué significan los códigos de salida.

  

Recomiendo un apagado limpio con la salida (0) incorporada en lugar de usar sys.exit ()

No estoy seguro si este es un buen consejo.

La misma documentación mencionada lee:

  

El módulo del sitio (que se importa automáticamente durante el inicio, excepto si se proporciona la opción de línea de comandos -S) agrega varias constantes al espacio de nombres incorporado. Son útiles para el intérprete interactivo y no deben usarse en programas .

Entonces:

  

salir (código = Ninguno)

     

Objetos que, cuando se imprimen, imprimen un mensaje como "Use quit () o Ctrl-D (es decir, EOF) para salir", y cuando se le llama, levanta SystemExit con el código de salida especificado.

Si lo comparamos con sys.exit () documentación, utiliza el mismo mecanismo que genera una excepción SystemExit .

Los códigos de salida en muchos lenguajes de programación dependen de los programadores. Por lo tanto, debe mirar el código fuente de su programa (o manual). Cero generalmente significa "todo salió bien".

Para permitir que se ejecuten controladores de excepciones y otras cosas, recomiendo un apagado limpio con el exit (0) integrado en lugar de usar sys.exit () que finaliza el proceso abruptamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top