Pregunta

soy consciente de la die() Comando en PHP que detiene un script antes de tiempo.

¿Cómo puedo hacer esto en Python?

¿Fue útil?

Solución

import sys
sys.exit()

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

sys.salida([argumento])

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

El argumento opcional argumento puede ser un entero que proporciona el estado de salida (predeterminado a cero) u otro tipo de objeto.Si es un entero, cero se considera "terminación exitosa" y cualquier valor distinto de cero se considera "terminación anormal" por los conchas y similares.La mayoría de los sistemas requieren que esté en el rango 0-127, y produzca resultados indefinidos de lo contrario.Algunos sistemas tienen una convención para asignar significados específicos a códigos de salida específicos, pero estos generalmente están subdesarrollados;Los programas UNIX generalmente usan 2 para errores de sintaxis de 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 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 ocurre un error.

Desde exit() En última instancia, "solo" plantea una excepción, solo saldrá del proceso cuando se solicite desde el hilo principal, y la excepción no se intercepta.

Tenga en cuenta que esta es la forma "bonita" de salir.@matriz retorcida glifo a continuación señala que si desea una 'salida completa', puede usar os._exit(código de error), aunque es probable que sea específico del sistema operativo hasta cierto punto (puede que no acepte 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 finalice el proceso.

Otros consejos

Una forma sencilla de finalizar un script de Python antes de tiempo es utilizar la función integrada quit().No es necesario importar ninguna biblioteca y es eficiente y sencillo.

Ejemplo:

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

Otra forma es:

raise SystemExit

Si bien generalmente deberías preferir sys.exit debido a que 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 inmediatamente y es posible que se encuentre dentro de algún controlador de excepciones que detectaría SystemExit, hay otra función - os._exit - que termina inmediatamente en el nivel C y no realiza ninguna de las operaciones normales de desmontaje del intérprete;por ejemplo, los ganchos registrados con el módulo "atexit" no se ejecutan.

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.

from sys import exit
exit()

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

Acabo de descubrir que al escribir una aplicación multiproceso, raise SystemExit y sys.exit() ambos matan solo el 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 vivirá para siempre, pero Kenny es llamado recursivamente y debería 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._exit, De lo contrario, sólo 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()

Soy totalmente novato pero seguro que esto es más limpio y 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()

...

Programa terminado Rastreo (última llamada más reciente):Archivo "Z: Directory testdieProgram.py", línea 12, en el archivo main () "Z: Directory testdieProgram.py", línea 8, en el sys.exit () SystemExit

Editar

La cuestión es que el programa finalice sin contratiempos y de forma pacífica, en lugar de "¡¡¡HE PARADO !!!!"

En Python 3.5, intenté incorporar código similar sin el uso de módulos (p. ej.sys, Biopy) aparte de lo que está integrado para detener el script e imprimir un mensaje de error para 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 conciso 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!");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top