it-swarm-es.tech

Terminando un script de Python

Soy consciente del comando die() en PHP que detiene un script antes.

¿Cómo puedo hacer esto en Python?

867
Teifion
import sys
sys.exit()

detalles de la documentación del módulo sys :

sys.exit([arg])

Salir de Python. Esto se implementa elevando la excepción SystemExit , por lo que se respetan las acciones de limpieza especificadas por las cláusulas finalmente de try , y es posible interceptar el intento de salida en un nivel externo.

El argumento opcional arg puede ser un entero que dé el estado de salida (por defecto 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-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 poco desarrollados; Los programas Unix generalmente usan 2 para los errores de sintaxis de la 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 en 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 un se produce un error.

Dado que exit() finalmente "solo" genera una excepción, solo saldrá del proceso cuando se le llame desde el subproceso principal, y la excepción no se interceptará.

Tenga en cuenta que esta es la manera 'Niza' de salir. @ glyphtwistedmatrix a continuación señala que si desea una 'salida difícil', puede usar os._exit ( errorcode ), aunque es probable que sea específico del sistema operativo hasta cierto punto (puede que no sea necesario código de error bajo Windows, por ejemplo), y definitivamente es menos amigable ya que no permite que el intérprete realice ninguna limpieza antes de que el proceso muera.

1180
pjz

Una forma sencilla de terminar un script de Python temprano es usar la función integrada quit (). No hay necesidad de importar ninguna biblioteca, y es eficiente y simple.

Ejemplo:

#do stuff
if this == that:
  quit()
258
j.m.g.r

Otra forma es:

raise SystemExit
107
Vhaerun

Si bien, por lo general, debería preferir sys.exit porque es más "amigable" que el otro código, todo lo que realmente hace es generar una excepción.

Si está seguro de que necesita salir de un proceso inmediatamente y podría estar dentro de algún controlador de excepción que detectaría SystemExit, hay otra función, os._exit, que termina inmediatamente en el nivel C y no realiza ninguna de las roturas normales -sobre el intérprete; por ejemplo, los ganchos registrados con el módulo "atexit" no se ejecutan.

62
Glyph

También puede utilizar simplemente exit().

Tenga en cuenta que sys.exit(), exit(), quit() y os._exit(0) kill the intérprete de Python. Por lo tanto, si aparece en un script llamado desde otro script por execfile(), detiene la ejecución de ambos scripts.

Consulte " Detener la ejecución de un script llamado con execfile " para evitar esto.

58
Space cowboy
from sys import exit
exit()

Como parámetro, puede pasar un código de salida, que se devolverá al sistema operativo. El valor predeterminado es 0.

24
cleg

Acabo de descubrir que al escribir una aplicación multiproceso, raise SystemExit y sys.exit() solo matan al hilo en ejecución. Por otro lado, os._exit() sale de todo el proceso. Esto fue discutido aquí.

El siguiente ejemplo tiene 2 hilos. Kenny y Cartman. Se supone que Cartman debe vivir para siempre, pero a Kenny se le llama recursivamente y debe morir después de 3 segundos. (La llamada recursiva no es la mejor manera, pero tuve otras razones)

Si también queremos que Cartman muera cuando Kenny muera, Kenny debería irse con os._exit, de lo contrario, solo Kenny morirá y Cartman vivirá para siempre.

import threading
import time
import sys
import os

def kenny(num=0):
    if num > 3:
        # print("Kenny dies now...")
        # raise SystemExit #Kenny will die, but Cartman will live forever
        # sys.exit(1) #Same as above

        print("Kenny dies and also kills Cartman!")
        os._exit(1)
    while True:
        print("Kenny lives: {0}".format(num))
        time.sleep(1)
        num += 1
        kenny(num)

def cartman():
    i = 0
    while True:
        print("Cartman lives: {0}".format(i))
        i += 1
        time.sleep(1)

if __== '__main__':
    daemon_kenny = threading.Thread(name='kenny', target=kenny)
    daemon_cartman = threading.Thread(name='cartman', target=cartman)
    daemon_kenny.setDaemon(True)
    daemon_cartman.setDaemon(True)

    daemon_kenny.start()
    daemon_cartman.start()
    daemon_kenny.join()
    daemon_cartman.join()
21
eaydin

Soy un novato total, pero seguramente esto es más limpio y más controlado.

def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        return
    print 'You wont see this'

if __== '__main__': 
    main()

...

Programa terminado

que

import sys
def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        sys.exit()
    print 'You wont see this'

if __== '__main__': 
    main()

...

Programa finalizado Traceback (última llamada más reciente): Archivo "Z:\Directory\testdieprogram.py", línea 12, en main () Archivo "Z:\Directory\testdieprogram.py", línea 8, en main sys.exit ( ) SystemExit

Editar

El punto es que el programa termina sin problemas y en paz, en lugar de "¡¡¡HE PARADO !!!!"

15
Floggedhorse

En Python 3.5, intenté incorporar un código similar sin usar módulos (por ejemplo, sys, Biopy), aparte del que está incorporado para detener el script e imprimir un mensaje de error a mis usuarios. Aquí está mi ejemplo:

## My example:
if "ATG" in my_DNA: 
    ## <Do something & proceed...>
else: 
    print("Start codon is missing! Check your DNA sequence!");
    exit(); ## as most folks said above

Más tarde, descubrí que es más breve simplemente lanzar un error:

## My example revised:
if "ATG" in my_DNA: 
    ## <Do something & proceed...>
else: 
    raise ValueError("Start codon is missing! Check your DNA sequence!");
6
David C.