No estoy seguro en absoluto. En Unix / Linux, el estándar es: salir 0 en caso de que todo estuviera bien. Escriba un comando, luego echo $ ?: si lee 0, se devuelve sin error. La idea es tener pruebas estándar. Si el código xyz.py no encontró ningún error, ¡DEBERÍA devolver 0!
Bruno von Paris
1
Si desea cambiar el código de salida, prefiera salir limpiamente usando la salida incorporada, vea esta respuesta
El argumento opcional arg puede ser un número entero que proporciona el estado de salida (predeterminado a cero) u otro tipo de objeto. Si es un número entero, cero se considera "terminación exitosa" y cualquier valor distinto de cero se considera "terminación anormal" por shells y similares. La mayoría de los sistemas requieren que esté en el rango de 0 a 127 y, de lo contrario, producen resultados indefinidos. Algunos sistemas tienen una convención para asignar significados específicos a códigos de salida específicos, pero estos generalmente están subdesarrollados; Los programas Unix generalmente usan 2 para errores de sintaxis de línea de comando y 1 para todos los demás tipos de errores.
Un ejemplo donde se usan códigos de salida son los scripts de shell. En bash puede verificar la variable especial $?para el último estado de salida:
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 esto es lo correcto.
errno.h es típicamente para códigos de salida de llamada de función. Los intentos de estandarizar los códigos de salida del programa han resultado en /usr/include/sysexits.h presente en la mayoría de los sistemas POSIX.
mpounsett
1
¡Es muy bueno saber que "los programas de Unix generalmente usan 2 para errores de sintaxis de línea de comandos"!
dantiston
2
@dantiston Concur. Defensor de Gentoo teñido en la lana, pero nunca supe eso ... hasta este día predestinado. ( Mi vergüenza termina ahora ) . Relacionado, tenga en cuenta que greprompe esta tendencia al salir 1cuando no coinciden las líneas y 2en los errores reales. Muchas gracias, Stallman.
Cecil Curry
32
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
Esto es incorrecto. Estos errores no están destinados a ser utilizados como códigos de salida de proceso. Estos son códigos de error de bajo nivel destinados a ser utilizados internamente en programas, específicamente aquellos escritos en lenguaje C. Para Python, use excepciones siempre que sea posible.
SvdB
2
Tienes razón. Estos deben ser utilizados internamente. Pero normalmente no genera excepciones en el nivel del usuario final. Utiliza sys.exit (x) con x siendo un número entero que elige arbitrariamente. Pero puede usar aquellos que comienzan con EX_ y se definen en el módulo 'os'. Como os.EX_OK o os.EX_IOERR
Oli
2
Lo siento, pero también estoy rechazando esto porque es engañoso. Los códigos de estado de salida y los números de error no son intercambiables / complementarios. Usando el ejemplo dado, "permiso denegado" tiene un código de error de 13 (según errnoy errno.h ), pero un código de estado de salida de 77 (según osy sysexits.h ). Los programas que emiten los primeros no son estándar ( de facto vel jure ) y no funcionarán bien con otros que con razón esperan lo último.
Mark G.
14
Los códigos de salida de 0 generalmente significan "aquí no hay nada malo". Sin embargo, si el programador del script no siguió la convención, es posible que deba consultar la fuente para ver qué significa. Por lo general, se devuelve un valor distinto de cero como un código de error.
Solo para completar, se imprimirá 'No está bien' si el script de Python generó un error O tuvo un error de sintaxis.
Shital Shah
5
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 publicación de Advanced Shell Script .
El módulo del sitio (que se importa automáticamente durante el inicio, excepto si se da 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 .
Luego:
salida (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 la documentación de sys.exit () , está utilizando el mismo mecanismo que está generando una SystemExitexcepción.
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í.
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".
Siguiendo los códigos de salida de Unix 0 - para éxito / OK, 1 - sin éxito / error. Simplemente puede usar exit(0)o exit(1)llamar sin importar el sysmódulo.
Para permitir que se ejecuten controladores de excepciones y otras cosas, recomiendo un apagado limpio con el exit(0)incorporado en lugar de usar el sys.exit()que finaliza el proceso abruptamente.
Entonces, ¿cuál es la diferencia? ¿De dónde viene esta información? ¿Te refieres a la ejecución de los controladores "a la salida" o a qué te refieres exactamente? SystemExitparece levantarse de cualquier manera.
0xC0000022L
mm, lo confundí con os._exit, ambos parecen subir SystemExit.
vidstige
1
Incorrecto: sys.exit()se apaga limpiamente, al igual que exit(). Ambos hacen lo mismo : plantear una SystemExitexcepción. En realidad, exit()está destinado a las sesiones interactivas, no a los scripts, por lo que conceptualmente sys.exit()es el indicado. Puede ser confuso con os._exit(), ese es el que termina abruptamente.
Respuestas:
Lo que estás buscando en el script son las 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.
fuente
De la documentación para
sys.exit
:Un ejemplo donde se usan códigos de salida son los scripts de shell. En bash puede verificar la variable especial
$?
para el último estado de salida: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 esto es lo correcto.fuente
grep
rompe esta tendencia al salir1
cuando no coinciden las líneas y2
en los errores reales. Muchas gracias, Stallman.Para el registro, puede usar los códigos de salida estándar POSIX definidos aquí .
Ejemplo:
fuente
exitstatus
paquete PyPI.Hay un
errno
módulo que define los códigos de salida estándar:Por ejemplo, el permiso denegado es el código de error 13 :
fuente
errno
y errno.h ), pero un código de estado de salida de 77 (segúnos
y sysexits.h ). Los programas que emiten los primeros no son estándar ( de facto vel jure ) y no funcionarán bien con otros que con razón esperan lo último.Los códigos de salida de 0 generalmente significan "aquí no hay nada malo". Sin embargo, si el programador del script no siguió la convención, es posible que deba consultar la fuente para ver qué significa. Por lo general, se devuelve un valor distinto de cero como un código de error.
fuente
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 && echo 'OK' || echo 'Not OK'
Si mi script de Python llama
sys.exit(0)
al shell, devuelve 'OK'Si mi script de Python llama
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.
fuente
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 publicación de Advanced Shell Script .
fuente
No estoy seguro si este es un buen consejo.
La misma documentación mencionada dice:
Luego:
Si lo comparamos con la documentación de sys.exit () , está utilizando el mismo mecanismo que está generando una
SystemExit
excepción.fuente
Si desea utilizar de forma portátil los códigos de salida POSIX estándar , consulte el
exitstatus
paquete en PyPI.Instala el paquete:
Use en su código:
fuente
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í.
fuente
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".
fuente
Siguiendo los códigos de salida de Unix 0 - para éxito / OK, 1 - sin éxito / error. Simplemente puede usar
exit(0)
oexit(1)
llamar sin importar elsys
módulo.fuente
Para permitir que se ejecuten controladores de excepciones y otras cosas, recomiendo un apagado limpio con el
exit(0)
incorporado en lugar de usar elsys.exit()
que finaliza el proceso abruptamente.fuente
SystemExit
parece levantarse de cualquier manera.os._exit
, ambos parecen subirSystemExit
.sys.exit()
se apaga limpiamente, al igual queexit()
. Ambos hacen lo mismo : plantear unaSystemExit
excepción. En realidad,exit()
está destinado a las sesiones interactivas, no a los scripts, por lo que conceptualmentesys.exit()
es el indicado. Puede ser confuso conos._exit()
, ese es el que termina abruptamente.