Comandos de salida de Python: ¿por qué tantos y cuándo se deben usar?

Parece que Python soporta muchos comandos diferentes para detener la ejecución del script.
Las opciones que he encontrado son: quit() , exit() , sys.exit() , os._exit()

¿Me he perdido alguno? ¿Cual es la diferencia entre ellos? ¿Cuándo usarías cada uno?

Permítanme darles alguna información sobre ellos:

  1. quit levanta la excepción SystemExit detrás de escena.

    Además, si lo imprimes, aparecerá un mensaje:

     >>> print (quit) Use quit() or Ctrl-Z plus Return to exit >>> 

    Esta funcionalidad se incluyó para ayudar a las personas que no conocen Python. Después de todo, una de las cosas más probables en las que un novato intentará salir de Python es escribir quit .

    Sin embargo, quit no debe utilizarse en el código de producción. Esto se debe a que solo funciona si el módulo del site está cargado. En su lugar, esta función solo debe usarse en el intérprete.

  2. exit es un alias para quit (o viceversa). Existen juntos simplemente para hacer que Python sea más fácil de usar.

    Además, también da un mensaje cuando se imprime:

     >>> print (exit) Use exit() or Ctrl-Z plus Return to exit >>> 

    Sin embargo, como quit , la exit se considera mala para usar en el código de producción y debe reservarse para su uso en el intérprete. Esto se debe a que también se basa en el módulo del site .

  3. sys.exit genera la excepción SystemExit en segundo plano. Esto significa que es lo mismo que quit y exit a ese respecto.

    Sin embargo, a diferencia de esos dos, sys.exit se considera bueno para usar en el código de producción. Esto es porque el módulo sys siempre estará allí.

  4. os._exit sale del progtwig sin llamar a los manejadores de limpieza, vaciar los buffers de stdio, etc. Por lo tanto, no es una forma estándar de salir y solo debe utilizarse en casos especiales. El más común de estos está en el (los) proceso (s) hijo (s) creado por os.fork .

    Tenga en cuenta que, de los cuatro métodos dados, solo este es único en lo que hace.

En resumen, los cuatro métodos salen del progtwig. Sin embargo, los dos primeros se consideran malos para usar en el código de producción y el último es una forma sucia no estándar que solo se usa en escenarios especiales. Entonces, si quiere salir de un progtwig normalmente, vaya con el tercer método: sys.exit .


O, incluso mejor, en mi opinión, puedes hacer directamente lo que sys.exit hace entre bastidores y ejecutar:

 raise SystemExit 

De esta manera, no es necesario importar primero el sistema.

Sin embargo, esta elección es sencillamente una cuestión de estilo y depende exclusivamente de usted.

Las funciones * quit() , exit() y sys.exit() funcionan de la misma manera: SystemExit excepción SystemExit . Por lo tanto, no hay una diferencia real, excepto que sys.exit() siempre está disponible, pero exit() y quit() solo están disponibles si se importa el módulo del site .

La función os._exit() es especial, sale inmediatamente sin llamar a ninguna función de limpieza (por ejemplo, no vacía búferes). Esto está diseñado para casos de uso altamente especializados … básicamente, solo en el niño después de una llamada a os.fork() .

Conclusión

  • Use exit() o quit() en el REPL.

  • Use sys.exit() en scripts, o raise SystemExit() si lo prefiere.

  • Use os._exit() para que los procesos secundarios salgan después de una llamada a os.fork() .

Se puede llamar a todos estos elementos sin argumentos, o puede especificar el estado de salida, por ejemplo, exit(1) o raise SystemExit(1) para salir con el estado 1. Tenga en cuenta que los progtwigs portátiles están limitados para salir de los códigos de estado en el rango 0- 255, si raise SystemExit(256) en muchos sistemas, esto se truncará y su proceso realmente saldrá con el estado 0.

Notas al pie

* En realidad, quit() y exit() son objetos de instancia invocables, pero creo que está bien llamarlos funciones.

sys.exit es la forma canónica de salir.

Internamente sys.exit solo eleva SystemExit . Sin embargo, llamar a sys.exit es más idiomático que elevar SystemExit directamente.

os.exit es una llamada del sistema de bajo nivel que sale directamente sin llamar a ningún controlador de limpieza.

quit y exit existen solo para proporcionar una salida fácil del indicador de Python. Esto es para usuarios nuevos o usuarios que ingresaron accidentalmente en el indicador de Python y no desean conocer la syntax correcta. Es probable que intenten escribir exit o quit . Si bien esto no saldrá del intérprete, al menos emite un mensaje que les indica una salida:

 >>> exit Use exit() or Ctrl-D (ie EOF) to exit >>> exit() $ 

Básicamente, esto es solo un truco que utiliza el hecho de que el intérprete imprime el __repr__ de cualquier expresión que ingrese en el indicador.

Diferentes medios de salida

os._exit() :

  • Salga del proceso sin llamar a los manejadores de limpieza.

exit(0) :

  • Una salida limpia sin ningún error / problema.

exit(1) :

  • Hubo algún problema / error / problema y es por eso que el progtwig está saliendo.

sys.exit() :

  • Cuando el sistema y python se apaga; significa que se está utilizando menos memoria después de ejecutar el progtwig.

quit() :

  • Cierra el archivo python.

Resumen

Básicamente, todos hacen lo mismo, sin embargo, también depende de para qué lo haces.

No creo que hayas omitido nada y recomendaría que te acostumbras a quit() o exit() .

sys.exit() y os._exit() principalmente si está usando archivos grandes o está usando python para controlar el terminal.

De lo contrario, utilice principalmente exit() o quit() .