Pregunta Terminar una secuencia de comandos de Python


Soy consciente de que die() comando en PHP que detiene un script temprano.

¿Cómo puedo hacer esto en Python?


751
2017-09-16 15:35


origen


Respuestas:


import sys
sys.exit()

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

sys.salida([arg])

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

El argumento opcional arg puede ser un número entero que da el estado de salida     (valor predeterminado a cero) u otro tipo de objeto. Si es un número entero,     cero se considera "finalización exitosa" y cualquier valor distinto de cero es     considerada "terminación anormal" por proyectiles y similares. La mayoría de sistemas     requiere que esté en el rango 0-127 y produzca resultados indefinidos     de otra manera. Algunos sistemas tienen una convención para asignar     significados para códigos de salida específicos, pero estos son generalmente     subdesarrollado; Los programas de Unix generalmente usan 2 para la sintaxis de la línea de comando     errores y 1 para todo tipo de errores. Si otro tipo de objeto     se pasa, Ninguno es equivalente a pasar cero, y cualquier otro objeto es     impreso a 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 error ocurre

Ya que exit() finalmente "solo" plantea una excepción, solo saldrá     el proceso cuando se llama desde el hilo principal, y la excepción no es     interceptado.

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


1031
2017-09-16 15:36



Una forma simple de finalizar un script de Python antes de tiempo es usar la función incorporada quit (). No es necesario importar ninguna biblioteca, y es eficiente y simple.

Ejemplo:

#do stuff
if this == that:
  quit()

219
2018-02-12 15:50



Otra forma es:

raise SystemExit

102
2017-09-16 15:37



Mientras que generalmente deberías preferir 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 manejador de excepciones que capturaría SystemExit, hay otra función - os._exit - que finaliza inmediatamente en el nivel C y no realiza ninguna de las interrupciones normales del intérprete; por ejemplo, los ganchos registrados con el módulo "atexit" no se ejecutan.


59
2017-09-16 20:08



También puedes usar simplemente exit().

Manten eso en mente sys.exit(), exit(), quit()y os._exit(0)  matar el 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.

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


47
2018-04-22 14:57



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.


25
2017-09-16 15:38



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 __name__ == '__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 __name__ == '__main__': 
    main()

...

Traceback terminado por el programa (ú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 "¡ME PARÉ!"


16
2018-03-19 11:13



Acabo de descubrir que cuando escribo una aplicación multihilo, raise SystemExit y sys.exit() ambos matan solo el hilo en ejecución. Por otra parte, 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 Kenny recibe un llamado recursivo 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 con os._exitDe 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 __name__ == '__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()

13
2017-11-10 10:59



En Python 3.5, traté de incorporar código similar sin utilizar módulos (por ejemplo, sys, Biopy) distintos de los incorporados 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 sucinto simplemente arrojar un error:

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

5
2017-12-27 18:12



intenta usar descanso después de un ciclo, luego use quit () o exit ().


0
2018-06-11 00:00