Comandi di uscita di Python: perché così tanti e quando ognuno dovrebbe essere usato?


490

Sembra che Python supporti molti comandi diversi per fermare l'esecuzione degli script.
Le scelte che ho trovato sono: quit(), exit(), sys.exit(),os._exit()

Ne ho perso qualcuno? Qual è la differenza tra loro? Quando li useresti?


1
Ti sei persoos.abort()
The Daleks

Risposte:


765

Lasciami dare alcune informazioni su di loro:

  1. quit()solleva semplicemente l' SystemExiteccezione.

    Inoltre, se lo stampi, verrà visualizzato un messaggio:

    >>> print (quit)
    Use quit() or Ctrl-Z plus Return to exit
    >>>
    

    Questa funzionalità è stata inclusa per aiutare le persone che non conoscono Python. Dopotutto, una delle cose più probabili che un principiante proverà ad uscire da Python sta digitando quit.

    Tuttavia, nonquit dovrebbe essere usato nel codice di produzione. Questo perché funziona solo se il modulo è caricato. Invece, questa funzione dovrebbe essere utilizzata solo nell'interprete.site

  2. exit()è un alias per quit(o viceversa). Esistono insieme semplicemente per rendere Python più user-friendly.

    Inoltre, dà anche un messaggio quando viene stampato:

    >>> print (exit)
    Use exit() or Ctrl-Z plus Return to exit
    >>>
    

    Tuttavia, come quit, exitè considerato male da usare nel codice di produzione e dovrebbe essere riservato per l'uso nell'interprete. Questo perché si basa anche sul sitemodulo.

  3. sys.exit()solleva anche l' SystemExiteccezione. Ciò significa che è lo stesso quite exital riguardo.

    A differenza di questi due, tuttavia, sys.exitè considerato buono da usare nel codice di produzione. Questo perché il sysmodulo sarà sempre lì.

  4. os._exit()esce dal programma senza chiamare i gestori di pulizia, svuotare i buffer stdio, ecc . Pertanto, non è un modo standard per uscire e dovrebbe essere utilizzato solo in casi speciali. Il più comune di questi è nei processi figlio creati da os.fork.

    Si noti che, tra i quattro metodi indicati, solo questo è unico in ciò che fa.

Riassumendo, tutti e quattro i metodi escono dal programma. Tuttavia, i primi due sono considerati cattivi da utilizzare nel codice di produzione e l'ultimo è un modo non standard e sporco che viene utilizzato solo in scenari speciali. Quindi, se si vuole uscire da un programma normalmente, andare con il terzo metodo: sys.exit.


O, meglio ancora secondo me, puoi semplicemente fare direttamente ciò che sys.exitfa dietro le quinte ed eseguire:

raise SystemExit

In questo modo, non è necessario importare sysprima.

Tuttavia, questa scelta è semplicemente una scelta di stile e dipende esclusivamente da te.


2
Ma nella shell ipython, quite exitchiudere la shell mentre sys.exitnon lo fa.
Lee,

5
sys.exit()non è un modo affidabile per chiudere. Se viene chiamato all'interno di un thread, terminerà solo quel thread a meno che non si trovi nel thread principale. Questo può portare a molti casi in cui il programma continua perché la chiamata non era nel thread principale, specialmente perché alcuni interpreti eseguiranno il thread invisibile delle chiamate.
Elliot

1
Voto per l'aggiunta di un endcomando che lo farebbe raise SystemExit. Non vedo perché non ci può essere qualcosa di semplice come quello di BASIC.
Brian Burns,

6
@BrianBurns: non vale la pena aggiungere sintassi dedicata e riservare un'altra parola chiave. Questo è simile al perché è printstato cambiato da un'istruzione a una funzione. È facile aggiungere la sintassi, ma comporta un costo di complessità.
user2357112 supporta Monica il

1
Le parentesi sono importanti quando si chiama sys.exit()?
Lindhe

100

Le funzioni * quit() , exit()e sys.exit()funzionano allo stesso modo: aumentano l' SystemExiteccezione. Quindi non c'è una vera differenza, tranne che sys.exit()è sempre disponibile ma exit()e quit()sono disponibili solo se il sitemodulo viene importato.

La os._exit()funzione è speciale, esce immediatamente senza chiamare alcuna funzione di pulizia (ad esempio, non scarica i buffer). Questo è progettato per casi d'uso altamente specializzati ... in pratica, solo nel bambino dopo una os.fork()chiamata.

Conclusione

  • Utilizzare exit()o quit()nella REPL.

  • Utilizzare sys.exit()negli script o, raise SystemExit()se si preferisce.

  • Utilizzare os._exit()per i processi figlio per uscire dopo una chiamata a os.fork().

Tutti questi possono essere chiamati senza argomenti, oppure è possibile specificare lo stato di uscita, ad esempio, exit(1)o raise SystemExit(1)per uscire con lo stato 1. Si noti che i programmi portatili sono limitati ai codici di stato di uscita nell'intervallo 0-255, se raise SystemExit(256)su molti sistemi questo viene troncato e il processo effettivamente terminerà con lo stato 0.

Le note

* In realtà, quit()e exit()sono oggetti di istanza richiamabili, ma penso che sia giusto chiamarli funzioni.


50

Diversi mezzi di uscita

os._exit():

  • Esci dal processo senza chiamare i gestori di pulizia.

exit(0):

  • un'uscita pulita senza errori / problemi.

exit(1):

  • C'è stato qualche problema / errore / problema ed è per questo che il programma sta uscendo.

sys.exit():

  • Quando il sistema e Python si spengono; significa che viene utilizzata meno memoria dopo l'esecuzione del programma.

quit():

  • Chiude il file Python.

Sommario

Fondamentalmente fanno tutti la stessa cosa, tuttavia, dipende anche da quello per cui lo stai facendo.

Non credo che tu abbia lasciato fuori qualcosa e consiglierei di abituarti quit()o exit().

Utilizzeresti sys.exit()e os._exit()principalmente se stai usando file di grandi dimensioni o stai usando Python per controllare il terminale.

Altrimenti usa principalmente exit()o quit().


42

sys.exit è il modo canonico di uscire.

Internamente sys.exitaumenta SystemExit. Tuttavia, chiamare sys.exitè più idiomatico che sollevare SystemExitdirettamente.

os.exit è una chiamata di sistema di basso livello che esce direttamente senza chiamare alcun gestore di pulizia.

quited exitesiste solo per fornire una semplice via d'uscita dal prompt di Python. Questo è per i nuovi utenti o utenti che hanno inserito per errore il prompt di Python e non vogliono conoscere la sintassi corretta. È probabile che provino a digitare exito quit. Sebbene questo non esca dall'interprete, almeno emette un messaggio che dice loro una via d'uscita:

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
$

Questo è essenzialmente solo un trucco che utilizza il fatto che l'interprete stampa __repr__qualsiasi espressione che inserisci al prompt.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.