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

490

Parece que python admite 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?

Jonathan
fuente
1
Te has perdidoos.abort()
The Daleks

Respuestas:

765

Déjame darte información sobre ellos:

  1. quit()simplemente plantea la SystemExitexcepción.

    Además, si lo imprime, le dará 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 que un novato intentará salir de Python es escribir quit.

    Sin embargo, quitdebe no ser utilizado en el código de producción. Esto se debe a que solo funciona si el sitemódulo está cargado. En cambio, 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, al igual que quit, exitse considera malo usarlo en el código de producción y debe reservarse para el intérprete. Esto se debe a que también depende del sitemódulo.

  3. sys.exit()También plantea la SystemExitexcepción. Esto significa que es lo mismo quity exita ese respecto.

    Sin embargo, a diferencia de esos dos, sys.exitse considera bueno usarlo en el código de producción. Esto se debe a que el sysmódulo siempre estará allí.

  4. os._exit()sale del programa sin llamar a los manipuladores de limpieza, vaciando los buffers stdio, etc . Por lo tanto, no es una forma estándar de salir y solo debe usarse en casos especiales. El más común de estos está en los procesos secundarios creados 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 programa. 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. Por lo tanto, si desea salir de un programa normalmente, ir con el tercer método: sys.exit.


O, incluso mejor en mi opinión, puede hacer directamente lo que sys.exithace detrás de escena y ejecutar:

raise SystemExit

De esta manera, no necesita importar sysprimero.

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

mhsmith
fuente
2
Pero en ipython shell, quity exitsalga del shell mientras sys.exitno lo hace.
Lee
55
sys.exit()No es una forma confiable de cerrar. Si se llama dentro de un hilo, terminará solo ese hilo a menos que esté en el hilo principal. Esto puede conducir a muchos casos en los que el programa continúa porque la llamada no estaba en el hilo principal, especialmente porque algunos intérpretes enhebrarán invisiblemente las llamadas.
Elliot
1
Voto por agregar un endcomando que lo haría raise SystemExit. No veo por qué no puede haber algo así de simple, como en BASIC.
Brian Burns
66
@BrianBurns: No vale la pena agregar una sintaxis dedicada y reservar otra palabra clave. Esto es similar a por qué printse cambió de una declaración a una función. Es fácil agregar sintaxis, pero su costo es complejo.
user2357112 es compatible con Monica
1
¿Son importantes los paréntesis al llamar sys.exit()?
lindhe
100

Las funciones * quit() , exit()y sys.exit()funcionan de la misma manera: provocan la SystemExitexcepción. Así que no hay diferencia real, excepto que sys.exit()siempre está disponible, pero exit()y quit()sólo están disponibles si el sitemódulo ha sido importada.

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

Conclusión

  • Uso exit()o quit()en la REPL.

  • Úselo 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().

Todos estos pueden llamarse sin argumentos, o puede especificar el estado de salida, por ejemplo, exit(1)o raise SystemExit(1)salir con el estado 1. Tenga en cuenta que los programas portátiles están limitados a los códigos de estado de salida 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.

Dietrich Epp
fuente
50

Diferentes medios de salida

os._exit():

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

exit(0):

  • Una salida limpia sin errores / problemas.

exit(1):

  • Hubo algún problema / error / problema y es por eso que el programa se está cerrando.

sys.exit():

  • Cuando el sistema y Python se apagan; significa que se usa menos memoria después de ejecutar el programa.

quit():

  • Cierra el archivo python.

Resumen

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

No creo que hayas dejado nada fuera y recomendaría acostumbrarte quit()o exit().

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

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

Mike Williamson
fuente
42

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

Internamente sys.exitsolo aumenta SystemExit. Sin embargo, llamar sys.exites más idiomático que subir SystemExitdirectamente.

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

quity exitexisten solo para proporcionar una salida fácil del indicador de Python. Esto es para usuarios nuevos o usuarios que ingresaron accidentalmente el indicador de Python y no desean conocer la sintaxis correcta. Es probable que intenten escribir exito 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 (i.e. EOF) to exit
>>> exit()
$

Esto es esencialmente un truco que utiliza el hecho de que el intérprete imprime __repr__cualquier expresión que ingrese en el indicador.

oefe
fuente