Commandes de sortie Python - pourquoi tant et quand les utiliser?

491

Il semble que python supporte de nombreuses commandes différentes pour arrêter l'exécution du script.
Les choix que j'ai trouvé sont: quit(), exit(), sys.exit(),os._exit()

En ai-je manqué? Quelle est la différence entre eux? Quand les utiliseriez-vous?

Jonathan
la source
1
Vous avez manquéos.abort()
The Daleks

Réponses:

766

Permettez-moi de vous donner quelques informations à leur sujet:

  1. quit()soulève simplement l' SystemExitexception.

    De plus, si vous l'imprimez, il donnera un message:

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

    Cette fonctionnalité a été incluse pour aider les personnes qui ne connaissent pas Python. Après tout, l'une des choses les plus probables qu'un débutant tentera de quitter Python est de taper quit.

    Néanmoins, nequit doit pas être utilisé dans le code de production. En effet, cela ne fonctionne que si le sitemodule est chargé. Au lieu de cela, cette fonction ne doit être utilisée que dans l'interpréteur.

  2. exit()est un alias pour quit(ou vice-versa). Ils existent ensemble simplement pour rendre Python plus convivial.

    De plus, il donne également un message lors de l'impression:

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

    Cependant, comme quit, exitest considéré comme mauvais à utiliser dans le code de production et doit être réservé pour une utilisation dans l'interpréteur. C'est parce qu'il repose lui aussi sur le sitemodule.

  3. sys.exit()soulève également l' SystemExitexception. Cela signifie qu'il est le même que quitet exità cet égard.

    Contrairement à ces deux cependant, il sys.exitest considéré comme bon à utiliser dans le code de production. En effet, le sysmodule sera toujours là.

  4. os._exit()quitte le programme sans faire appel à des gestionnaires de nettoyage, rinçage des tampons stdio, etc . Par conséquent, ce n'est pas un moyen standard de sortir et ne doit être utilisé que dans des cas spéciaux. Le plus commun d'entre eux se trouve dans le ou les processus enfant créés par os.fork.

    Notez que, parmi les quatre méthodes données, seule celle-ci est unique dans ce qu'elle fait.

En résumé, les quatre méthodes quittent le programme. Cependant, les deux premiers sont considérés comme mauvais à utiliser dans le code de production et le dernier est un moyen non standard et sale qui n'est utilisé que dans des scénarios spéciaux. Donc, si vous voulez quitter un programme normalement, aller avec la troisième méthode: sys.exit.


Ou, encore mieux à mon avis, vous pouvez simplement faire directement ce qui se sys.exitpasse dans les coulisses et exécuter:

raise SystemExit

De cette façon, vous n'avez pas besoin d'importer d' sysabord.

Cependant, ce choix est simplement un sur le style et est purement à vous.

mhsmith
la source
2
Mais dans le shell ipython, quitet exitquittez le shell alors que ce sys.exitn'est pas le cas.
Lee
5
sys.exit()n'est pas un moyen fiable de fermer. S'il est appelé à l'intérieur d'un thread, il ne terminera que ce thread, sauf s'il se trouve dans le thread principal. Cela peut conduire à de nombreux cas où le programme continue parce que l'appel n'était pas dans le thread principal, d'autant plus que certains interprètes threadent invisiblement les appels.
Elliot
1
Je vote pour l'ajout d'une endcommande qui le ferait raise SystemExit. Je ne vois pas pourquoi il ne peut pas y avoir quelque chose de simple comme ça, comme dans BASIC.
Brian Burns
6
@BrianBurns: Cela ne vaut pas la peine d'ajouter une syntaxe dédiée et de réserver un autre mot-clé. Ceci est similaire à la raison pour laquelle printune instruction a été remplacée par une fonction. Il est facile d'ajouter de la syntaxe, mais cela entraîne un coût de complexité.
user2357112 prend en charge Monica
1
Les parenthèses sont-elles importantes lors de l'appel sys.exit()?
lindhe
100

Les fonctions * quit() , exit()et sys.exit()fonctionnent de la même façon: ils soulèvent l' SystemExitexception. Il n'y a donc pas de différence réelle, si sys.exit()c'est toujours disponible , mais exit()et quit()ne sont disponibles que si le sitemodule est importé.

La os._exit()fonction est spéciale, elle se ferme immédiatement sans appeler de fonctions de nettoyage (elle ne vide pas les tampons, par exemple). Ceci est conçu pour des cas d'utilisation hautement spécialisés ... en gros, uniquement chez l'enfant après un os.fork()appel.

Conclusion

  • Utilisez exit()ou quit()dans le REPL.

  • Utilisez sys.exit()dans les scripts, ou raise SystemExit()si vous préférez.

  • Utilisez os._exit()pour que les processus enfants se terminent après un appel à os.fork().

Tous ces éléments peuvent être appelés sans arguments, ou vous pouvez spécifier l'état de sortie, par exemple, exit(1)ou raise SystemExit(1)pour quitter avec l'état 1. Notez que les programmes portables sont limités à des codes d'état de sortie compris entre 0 et 255, si raise SystemExit(256)sur de nombreux systèmes, cela être tronqué et votre processus se terminera réellement avec le statut 0.

Notes de bas de page

* En fait, quit()et exit()sont des objets d'instance appelables, mais je pense que c'est correct de les appeler des fonctions.

Dietrich Epp
la source
50

Différents moyens de sortie

os._exit():

  • Quittez le processus sans appeler les gestionnaires de nettoyage.

exit(0):

  • une sortie propre sans erreurs / problèmes.

exit(1):

  • Il y a eu un problème / une erreur / un problème et c'est pourquoi le programme se ferme.

sys.exit():

  • Lorsque le système et python s'arrêtent; cela signifie que moins de mémoire est utilisée après l'exécution du programme.

quit():

  • Ferme le fichier python.

Sommaire

Fondamentalement, ils font tous la même chose, cependant, cela dépend aussi de la raison pour laquelle vous le faites.

Je ne pense pas que vous ayez oublié quoi que ce soit et je recommanderais de vous habituer à quit()ou exit().

Vous utiliseriez sys.exit()et os._exit()principalement si vous utilisez de gros fichiers ou utilisez python pour contrôler le terminal.

Sinon, utilisez principalement exit()ou quit().

Mike Williamson
la source
42

sys.exit est la manière canonique de sortir.

En interne sys.exitsoulève juste SystemExit. Cependant, appeler sys.exitest plus idiomatique que relancer SystemExitdirectement.

os.exit est un appel système de bas niveau qui se termine directement sans appeler de gestionnaire de nettoyage.

quitet exitn'existent que pour fournir un moyen simple de sortir de l'invite Python. C'est pour les nouveaux utilisateurs ou les utilisateurs qui ont accidentellement entré l'invite Python et qui ne veulent pas connaître la bonne syntaxe. Ils sont susceptibles d'essayer de taper exitou quit. Bien que cela ne quitte pas l'interpréteur, il émet au moins un message qui leur indique une issue:

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

Il s'agit essentiellement d'un hack qui utilise le fait que l'interprète imprime la __repr__de toute expression que vous entrez à l'invite.

oefe
la source