it-swarm.it

Terminare uno script Python

Sono a conoscenza del comando die() in PHP che interrompe presto uno script.

Come posso farlo in Python?

889
Teifion
import sys
sys.exit()

dettagli dalla documentazione del modulo sysNAME_ :

sys.exit([arg])

Esci da Python. Questo è implementato sollevando l'eccezione SystemExitNAME _ , quindi le azioni di pulizia specificate dalle clausole finally di tryNAME _ le dichiarazioni sono onorate ed è possibile intercettare il tentativo di uscita a un livello esterno.

L'argomento facoltativo arg può essere un numero intero che fornisce lo stato di uscita (predefinito a zero) o un altro tipo di oggetto. Se è un numero intero, zero è considerato "terminazione positiva" e qualsiasi valore diverso da zero viene considerato "terminazione anomala" per shell e simili. La maggior parte dei sistemi richiede che sia nell'intervallo 0-127 e produca risultati non definiti altrimenti. Alcuni sistemi hanno una convenzione per assegnare significati specifici a specifici codici di uscita, ma questi sono generalmente sottosviluppati; I programmi Unix generalmente usano 2 per gli errori di sintassi della riga di comando e 1 per tutti gli altri tipi di errori. Se viene passato un altro tipo di oggetto, None equivale a passare zero e qualsiasi altro oggetto viene stampato su stderrNAME _ e restituisce un codice di uscita di 1. In particolare, sys.exit("some error message") è un modo rapido per uscire da un programma quando si verifica un errore.

Poiché exit() in definitiva "solo" genera un'eccezione, uscirà dal processo solo quando viene chiamato dal thread principale e l'eccezione non viene intercettata.

Si noti che questo è il modo "Nice" per uscire. @ glyphtwistedmatrix qui sotto indica che se si desidera un 'hard exit', è possibile utilizzare os._exit ( errorcode ), anche se probabilmente è specifico per os (potrebbe non richiedere un errore in Windows, ad esempio), ed è decisamente meno amichevole dal momento che non lascia che l'interprete esegua la pulizia prima che il processo muoia.

1203
pjz

Un modo semplice per terminare uno script Python in anticipo è usare la funzione built-in quit (). Non è necessario importare alcuna libreria ed è efficiente e semplice.

Esempio:

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

Un altro modo è:

raise SystemExit
109
Vhaerun

Mentre generalmente dovresti preferire sys.exit perché è più "amichevole" per un altro codice, tutto ciò che fa in realtà è sollevare un'eccezione.

Se sei sicuro di dover uscire immediatamente da un processo e potresti essere all'interno di qualche gestore di eccezioni che catturerebbe SystemExit, c'è un'altra funzione - os._exit - che termina immediatamente al livello C e non esegue nessuno dei normali strappi -down dell'interprete; ad esempio, gli hook registrati con il modulo "atexit" non vengono eseguiti.

62
Glyph

Puoi anche usare semplicemente exit().

Tieni presente che sys.exit(), exit(), quit() e os._exit(0) kill l'interprete Python. Pertanto, se appare in uno script chiamato da un altro script di execfile(), interrompe l'esecuzione di entrambi gli script.

Vedi " Interrompi l'esecuzione di uno script chiamato con execfile " per evitare questo.

60
Space cowboy
from sys import exit
exit()

Come parametro è possibile passare un codice di uscita, che verrà restituito al sistema operativo. L'impostazione predefinita è 0.

26
cleg

Ho appena scoperto che durante la scrittura di un'app multithreadded, raise SystemExit e sys.exit() entrambi uccidono solo il thread in esecuzione. D'altra parte, os._exit() termina l'intero processo. Questo è stato discusso qui.

L'esempio qui sotto ha 2 thread. Kenny e Cartman. Cartman dovrebbe vivere per sempre, ma Kenny è chiamato ricorsivamente e dovrebbe morire dopo 3 secondi. (la chiamata ricorsiva non è il modo migliore, ma avevo altri motivi)

Se vogliamo anche che Cartman muoia quando Kenny muore, Kenny dovrebbe andare via con os._exit, altrimenti, solo Kenny morirà e Cartman vivrà per sempre.

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()
22
eaydin

Sono un principiante assoluto, ma sicuramente questo è più pulito e più controllato

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

if __== '__main__': 
    main()

...

Programma terminato

di

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

if __== '__main__': 
    main()

...

Programma terminato Traceback (ultima chiamata ultima): File "Z:\Directory\testdieprogram.py", riga 12, nel file principale () "Z:\Directory\testdieprogram.py", riga 8, nel file sys.exit principale ( ) SystemExit

Modificare

Il punto è che il programma termina in modo fluido e pacifico, piuttosto che "I'VE STOPPED !!!!"

16
Floggedhorse

In Python 3.5, ho provato a incorporare un codice simile senza l'uso di moduli (ad es. Sys, Biopy) diversi da quelli incorporati per fermare lo script e stampare un messaggio di errore per i miei utenti. Ecco il mio esempio:

## 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

Più tardi, ho scoperto che è più sintetico lanciare un errore:

## 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.