Soy consciente del die()
comando en PHP que sale temprano de un script.
¿Cómo puedo hacer esto en Python?
fuente
Soy consciente del die()
comando en PHP que sale temprano de un script.
¿Cómo puedo hacer esto en Python?
import sys
sys.exit()
detalles de la sys
documentación del módulo :
sys.exit([arg])
Salga de Python. Esto se implementa planteando la
SystemExit
excepción, por lo que se respetan las acciones de limpieza especificadas por las cláusulas finales de lastry
declaraciones, y es posible interceptar el intento de salida a un nivel externo.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, produce 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 comandos y 1 para todos los demás tipos de errores. Si se pasa otro tipo de objeto, Ninguno es equivalente a pasar cero, y cualquier otro objeto se imprime
stderr
y da como resultado un código de salida de 1. En particular,sys.exit("some error message")
es una forma rápida de salir de un programa cuando ocurre un error.Como
exit()
finalmente "solo" genera una excepción, solo saldrá del proceso cuando se llame desde el hilo principal, y la excepción no se intercepta.
Tenga en cuenta que esta es la forma "agradable" de salir. @ glyphtwistedmatrix a continuación señala que si desea una 'salida dura', puede usar os._exit(*errorcode*)
, aunque es probable que sea específico del sistema operativo en cierta medida (por ejemplo, puede que no tome un código de error en Windows), y definitivamente es menos amigable ya que no deja que el intérprete realice ninguna limpieza antes de que el proceso falle.
sys.exit()
no funciona (no mata el proceso, solo mata el hilo) si lo levanta un hilo de fondo.sys.exit()
plantea unaSystemExit
excepción en el hilo actual.UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Una manera simple de terminar un script Python temprano es usar la
quit()
función incorporada. No es necesario importar ninguna biblioteca, y es eficiente y simple.Ejemplo:
fuente
Otra forma es:
fuente
sys.exit
envoltorio preferible (y sobrescribible)También puedes usar simplemente
exit()
.Tenga en cuenta que
sys.exit()
,exit()
,quit()
, yos._exit(0)
matar el intérprete de Python. Por lo tanto, si aparece en un script llamado desde otro script porexecfile()
, detiene la ejecución de ambos scripts.Consulte " Detener la ejecución de un script llamado con execfile " para evitar esto.
fuente
Si bien generalmente debería preferirlo
sys.exit
porque es más "amigable" con otro código, todo lo que realmente hace es generar una excepción.Si está seguro de que necesita salir de un proceso de inmediato, y podría estar dentro de algún controlador de excepciones que se detectaría
SystemExit
, hay otra funciónos._exit
, que finaliza inmediatamente en el nivel C y no realiza ninguna de las tareas normales de desmantelamiento. del intérprete; por ejemplo, los ganchos registrados con el módulo "atexit" no se ejecutan.fuente
Me acabo de enterar cuando escribo una aplicación multiproceso,
raise SystemExit
ysys.exit()
ambos matan solo el hilo en ejecución. Por otro lado,os._exit()
sale de todo el proceso. Esto se discutió en " ¿Por qué sys.exit () no sale cuando se llama dentro de un hilo en Python? ".El siguiente ejemplo tiene 2 hilos. Kenny y Cartman. Se supone que Cartman vive para siempre, pero Kenny se llama de forma recursiva y debe morir después de 3 segundos. (Las llamadas recursivas no son la mejor manera, pero tenía otras razones)
Si también queremos que Cartman muera cuando Kenny muera, Kenny debería irse
os._exit
, de lo contrario, solo Kenny morirá y Cartman vivirá para siempre.fuente
Como parámetro, puede pasar un código de salida, que se devolverá al sistema operativo. El valor predeterminado es 0.
fuente
exit()
ysys.exit()
no son lo mismo. No use losexit()
scripts incorporados , esto es solo una ayuda para el shell interactivo - usesys.exit()
Soy un novato total pero seguramente esto es más limpio y más controlado
...
que
...
Editar
El punto es que el programa termina sin problemas y pacíficamente, en lugar de "¡HE DETENIDO!"
fuente
return
para terminar el script. Todo lo quereturn
está haciendo es devolver un valor y un flujo de control a la función de llamada. Allí continúa con la ejecución justo después de la llamada de la función que llamóreturn
. Por supuesto, si estareturn
es la última declaración en su secuencia de comandos como en su ejemplo, entonces la secuencia de comandos termina inmediatamente después de que se llama.exit
, por lo tanto, los programadores de Python pueden no notar tanto el olor de este código); y, por último, (3) código multiproceso (que los pythonistas han ignorado históricamente).En Python 3.5, traté de incorporar un código similar sin el uso de módulos (por ejemplo, sys, Biopy) que no sean los que están integrados para detener el script e imprimir un mensaje de error a mis usuarios. Aquí está mi ejemplo:
Más tarde, descubrí que es más sucinto arrojar un error:
fuente
Mis dos centavos.
Python 3.8.1, Windows 10, 64 bits.
sys.exit()
no funciona directamente para miTengo varios bucles nexted.
Primero declaro una variable booleana, a la que llamo
immediateExit
.Entonces, al comienzo del código del programa escribo:
Luego, a partir de la excepción de bucle más interna (anidada), escribo:
Luego entro en la continuación inmediata del bucle externo, y antes de que el código ejecute cualquier otra cosa, escribo:
Dependiendo de la complejidad, a veces la declaración anterior debe repetirse también en las secciones excepto, etc.
El mensaje personalizado es también para mi depuración personal, ya que los números son para el mismo propósito: ver dónde realmente existe el script.
En mi caso particular, estoy procesando un archivo CSV, que no quiero que el software toque, si el software detecta que está dañado. Por lo tanto, para mí es muy importante salir de todo el script de Python inmediatamente después de detectar la posible corrupción.
Y siguiendo el sistema gradual que sale de todos los bucles me las arreglo para hacerlo.
Código completo: (se necesitaban algunos cambios porque es un código propietario para tareas internas):
fuente
except:
sin tipo de excepción. Si solo usaexcept Exception:
(o incluso un tipo de excepción más detallado si es posible),sys.exit()
funcionaría según lo previsto y no necesitaría esta solución.sys.exit()
es realmente una especie de solución de último recurso para errores críticos. Solo mis dos centavos :)