Hoy, vamos a bucear en el tema de salir/terminar scripts Python! Antes de empezar, debe tener una comprensión básica de lo que es Python y algunos conocimientos básicos sobre su uso.
Puede usar el IDE de su elección, pero esta vez usaré el paquete Linux Subsystem for Windows (WSL) de Microsoft. Para obtener más información sobre eso y cómo habilitarlo en Windows 10, vaya aquí.
tabla de contenidos
¿por qué Python sale automáticamente de un script cuando está terminado?,
la forma en que Python ejecuta un bloque de código hace que ejecute cada línea en orden, comprobando dependencias para importar, leyendo definiciones y clases para almacenar en memoria, y ejecutando piezas de código en orden permitiendo bucles y llamadas a las definiciones y clases definidas.
Cuando el intérprete de Python llega al final del archivo (EOF), se advierte que no pueden leer datos desde el origen, ya sea la entrada del usuario a través de un IDE o leer desde un archivo. Para demostrar, vamos a tratar de obtener la entrada del usuario e interrumpir el intérprete en el medio de la ejecución!,
primero, desde su terminal bash en PowerShell abra un nuevo archivo llamado «input».,n pegue lo siguiente en el shell haciendo clic con el botón derecho en la ventana de PowerShell
name=input("Don"t type anything!\n")print("Hi,",name,"!")
ahora, presione CTRL+X
para guardar y salir de la ventana nano y en su tipo de shell:
$ python3 input.pyDon"t type anything!
y presione CTRL+D
para terminar el programa mientras espera la entrada del usuario
Traceback (most recent call last):File "input.py", line 1, in name=input("Don"t type anything!")EOFError
la excepción EOFError
nos dice que el intérprete de Python terminó de ejecutar el código, ya que el Usuario no ingresó datos de entrada.,
Cuando Python alcanza la condición EOF al mismo tiempo que ha ejecutado todo el código sin lanzar ninguna excepción, que es una forma en que Python puede salir «con gracia».»
Detect script exit
Si Queremos saber cuándo sale un programa Python sin lanzar una excepción, podemos usar el módulo Python atexit
.
elatexit
maneja todo lo que queremos que el programa haga cuando sale y normalmente se usa para hacer limpieza del programa antes de que el proceso del programa termine
para experimentar con atexit, modifiquemos nuestra entrada.,py ejemplo para imprimir un mensaje al salir del programa. Abrir el input.py vuelva a archivar y reemplace el texto con este
import atexitatexit.register(print,"Program exited successfully!")name=input("What"s your name?\n")print("Hi,",name,"!")
escriba su nombre, y cuando presione enter debería obtener:
What"s your name?ExampleHi, Example !Program exited successfully!
observe cómo aparece el texto de salida al final de la salida sin importar dónde coloquemos la llamada atexit
y cómo si reemplazamos atexit
call with a simple print()
, obtenemos el texto de salida donde se realizó el print()
All, en lugar de donde sale el código.,
Program exited successfully!What"s your name?ExampleHi, Example !
Graceful exit
Hay varias maneras de salir de un programa Python que no implica lanzar una excepción; la primera que se va a intentar es quit()
Puede utilice el comando Bash echo $?
para obtener el código de salida del intérprete de Python.,
También podemos definir el tipo de código con el que debe salir el intérprete entregando quit()
un argumento entero inferior a 256
exit()
tiene la misma funcionalidad que es un alias para quit()
id=»92636a6070″> norexit()
se consideran buenas prácticas, ya que ambos requieren el módulosite
, que está destinado a ser utilizado para intérpretes interactivos y no en programas., Para nuestros programas, debemos usar algo como sys.exit
Aviso de que tenemos que importar explícitamente un módulo para llamar exit()
, esto puede parecer que no es una mejora, pero garantiza que el módulo está cargado porque no es una buena suposición site
se cargan en tiempo de ejecución., Si no queremos importar módulos adicionales, podemos hacer lo exit()
, quit()
y sys.exit()
están haciendo detrás de las escenas y de raise SystemExit
Salir con mensajes de error
Lo que si tenemos mal la entrada de un usuario?, Echemos un vistazo a nuestro script input.py
, y agreguemos la capacidad de manejar la entrada incorrecta del usuario (CTRL+D
para pasar un carácter EOF)
el le dice a Python que pruebe el código dentro de la instrucción y pase cualquier excepción a la instrucción except
antes de salir.
salir sin error
¿Qué pasa si el Usuario entrega un error a su programa pero no desea que su código imprima un error, o que haga algún tipo de manejo de errores para minimizar el impacto del usuario?,
Podemos agregar una instrucción finally
que nos permite ejecutar código después de hacer nuestro manejo de errores en catch
observe que el usuario nunca conocería una EOFError
ocurrió, esto se puede usar para pasar valores predeterminados en caso de entrada o argumentos pobres.,
salga y libere sus recursos
generalmente, Python libera todos los recursos que ha llamado en su programa automáticamente cuando sale, pero para ciertos procesos, es una buena práctica encerrar algunos recursos limitados en un bloque with
.
a menudo verá esto en llamadas open()
, donde no liberar correctamente el archivo podría causar problemas con la lectura o escritura del archivo más tarde.
El with
bloquear automáticamente libera todos los recursos requisado dentro de ella., Si queremos asegurarnos más explícitamente de que el archivo esté cerrado, podríamos usar el comando atexit.register()
para llamar a close()
$ nano openfile.pyimport atexitfile=open("testfile.txt","w")file.write("let"s write some text!\n")atexit.register(file.close)
Si los recursos se llaman sin usar un bloque with
asegúrese de liberarlos explícitamente en un comando atexit
.
salir después de un tiempo
si nos preocupa que nuestro programa nunca termine normalmente, podemos usar el módulo multiprocessing
de Python para asegurarnos de que nuestro programa termine.,
observe cómo el proceso no se completó cuando se le dijo a la función que esperara 7 segundos, pero se completó e imprimió lo que se suponía que debía cuando se le dijo que esperara 0 segundos!
salir usando una instrucción return
Si tenemos una sección de código que queremos usar para terminar todo el programa, en lugar de dejar que la instrucciónbreak
continúe el código fuera del bucle, podemos usar la instrucciónreturn sys.exit()
para salir del código por completo.,
Exit in the middle of a function
Si no queremos usar una instrucción return, todavía podemos llamar a sys.exit()
para cerrar nuestro programa y proporcionar un return
en otra rama. Usemos nuestro código de break.py otra vez.
salir cuando se cumplen las condiciones
si tenemos un bucle en nuestro código Python y queremos asegurarnos de que el código puede salir si encuentra un problema, podemos usar una bandera que puede verificar para terminar el programa.,
Salir de la tecla
Si queremos mantener nuestro programa abierto en la consola hasta que se pulse una tecla, se puede utilizar un independiente input()
cerrar.
$ nano holdopen.pyinput("Press enter to continue")$ python3 holdopen.pyPress enter to continue$
también se puede pasar CTRL+C
a la consola para darle Python KeyboardInterrupt
carácter. Incluso podemos manejar la excepción KeyboardInterrupt
como hemos manejado excepciones antes.,
la Salida de un programa multiproceso
al Salir de un programa multiproceso es ligeramente más implicado, como un simple sys.exit()
se llama desde el hilo que sólo saldrá el subproceso actual., La forma «sucia» de hacerlo es usar os._exit()
como puede ver, el programa no imprimió el resto del programa antes de que saliera, es por eso que os._exit()
se reserva típicamente para un último recurso, y Thread.join()
del hilo principal es el método preferido para finalizar un programa multiproceso.,
End without sys exit
Sys.exit()
es solo una de varias maneras en que podemos salir de nuestros programas Python, lo que sys.exit()
hace es raise SystemExit
, por lo que podemos usar cualquier excepción integrada en Python o crear una propia!
también podemos utilizar la etiqueta os._exit()
para decirle al sistema host para matar el python proceso, aunque esto no hace atexit
limpieza.,
Salir a excepción
Si queremos salir en cualquier excepción, sin manipulación alguna, podemos usar nuestro try-except
bloque a ejecutar os._exit()
.
Exit and restart
finalmente, exploraremos lo que hacemos para salir de Python y reiniciar el programa, lo cual es útil en muchos casos.
espero que el tutorial sea útil. Sigue regresando.
Gracias.,
Fundador de LikeGeeks. Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable del mantenimiento, la seguridad y la solución de problemas de los servidores Linux para múltiples clientes en todo el mundo. Me encanta escribir scripts de shell y Python para automatizar mi trabajo.