Quitter la ligne de commande python

152

Pour quitter la ligne de commande Python, je dois taper exit (). Si je tape exit, il dit

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

Habituellement, lorsque vous tapez exit, vous souhaitez quitter le programme. Pourquoi l'interpréteur me donne-t-il l'erreur ci-dessus alors qu'il sait que j'essaye de quitter la ligne de commande? Pourquoi ne sort-il pas simplement? Je sais que cela n'a pas d'importance et que c'est une question idiote, mais je suis curieux.

Ank
la source
Cela pourrait avoir à voir avec la façon dont les fonctions sont souvent appelées ()à la fin ... sinon, cela pourrait (éventuellement) être une variable ... ou une sorte d'objet ...
Summea
à droite mais l'interprète sait que j'essaye de quitter et c'est pourquoi affiche ce message. sinon, il aurait imprimé un message d'erreur. S'il sait que j'essaye de sortir, il peut simplement sortir.
Ank
1
exit ou exit () jette une erreur pour moi d'environ 20% des installations que j'ai trouvées dans le monde ... Seul CTRL + Z + return fonctionne toujours.
Paulo Carvalho

Réponses:

37

Dans mon interpréteur python, il exity a en fait une chaîne et non une fonction - 'Use Ctrl-D (i.e. EOF) to exit.'. Vous pouvez vérifier votre interprète en entranttype(exit)

En python actif, ce qui se passe, c'est que la sortie est une fonction. Si vous n'appelez pas la fonction, il affichera la représentation sous forme de chaîne de l'objet. Il s'agit du comportement par défaut pour tout objet renvoyé. C'est juste que les concepteurs ont pensé que les gens pourraient essayer de taper exit pour quitter l'interpréteur, ils ont donc fait de la représentation sous forme de chaîne de la fonction de sortie un message utile. Vous pouvez vérifier ce comportement en tapant str(exit)ou même print exit.

Dunes
la source
14
Ctrl-Z est ce que vous faites sous Windows (enfin, DOS) où vous feriez Ctrl-D sur des systèmes de type Unix.
Karl Knechtel
@KarlKnechtel Ah, bon à savoir. J'ai peu d'expérience de la programmation sous Windows.
Dunes
60

Cela fonctionne pour moi, le meilleur moyen de sortir de l'invite python.

sortie()

Sreedhar GS
la source
4
Je suis confus au sujet de cette réponse ... la question elle-même dit qu'ils savent déjà que cela exit()fonctionne, et ils veulent savoir pourquoi exitsans parent ne fonctionne pas. Donc, cette réponse ne fait que répéter une partie de la question et n'y répond pas réellement.
Ben Lee
Je veux en quelque sorte décliner cette réponse pour ne pas avoir lu la question, mais je suppose que pour la plupart des installations python, c'est correct; c'est juste que l'utilisateur a dit que cela ne fonctionnait pas dans son cas, alors le recommander semble ... inapproprié.
person27
37

Lorsque vous tapez exitdans la ligne de commande, il trouve la variable avec ce nom et appelle __repr__(ou __str__) dessus. Habituellement, vous obtiendrez un résultat comme:

<function exit at 0x00B97FB0>

Mais ils ont décidé de redéfinir cette fonction pour que l' exitobjet affiche un message utile à la place. Que ce soit ou non un comportement stupide ou non, est une question subjective, mais une des raisons possibles pour lesquelles il ne «sort pas» est:

Supposons que vous regardez du code dans un débogueur, par exemple, et que l'un des objets fait référence à la exitfonction. Lorsque le débogueur essaie d'appeler __repr__cet objet pour vous afficher cette fonction, le programme s'arrête soudainement! Ce serait vraiment inattendu, et les mesures pour contrer qui pourraient compliquer davantage les choses (par exemple, même si vous limitez ce comportement à la ligne de commande, que se passe-t-il si vous essayez d'imprimer un objet qui a exitcomme attribut?)

mgibsonbr
la source
4
Dans ce cas, la fonction de sortie réelle n'est même pas dans la portée à moins que vous import sys, après quoi vous appelleriez sys.exit () pour quitter l'interpréteur.
Michael Dillon
19

Ce message est l' __str__attribut deexit

Regardez ces exemples :

1

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

2

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

3

>>> getattr(exit, '__str__')()
'Use exit() or Ctrl-D (i.e. EOF) to exit'
mouler
la source
19

Je vous recommande de quitter l'interpréteur Python avec Ctrl-D. Il s'agit de l'ancien code ASCII de fin de fichier ou de fin de transmission.

Jay Slupesky
la source
Il semble que cette méthode ne fonctionne pas si le script a rencontré une erreur.
blaylockbk
2
Ctrl-Breakfonctionne de manière cohérente sous Windows. Ctrl-Dou Ctrl-Ztravaillé sous Windows pour Python 2.7, 3.4, 3.6. Mais dans Python 3.7, ceux-ci ont cessé de fonctionner, et la séquence ASCII la plus courte qui existe est Ctrl-Z Enter.
Bob Stein
14

Avec Anaconda 4.5+ et Python 3.6+ sur Windows, utilisez

Ctrl+Z

ou

exit()

Dans certains cas, vous devrez peut-être utiliser

Ctrl+Break

Si votre ordinateur n'a pas de Breakclé, voyez ici .

Shital Shah
la source
8

Parce que l'interpréteur n'est pas un shell dans lequel vous fournissez des commandes, c'est - enfin - un interpréteur. Les choses que vous lui donnez sont du code Python.

La syntaxe de Python est telle que exit, en elle-même, ne peut être autre chose qu'un nom pour un objet. Le simple fait de se référer à un objet ne peut rien faire (sauf ce que fait normalement la boucle read-eval-print, c'est-à-dire afficher une représentation sous forme de chaîne de l'objet).

Karl Knechtel
la source
6

Vous pouvez résoudre ce problème.

Lien PYTHONSTARTUPvers un fichier python avec les éléments suivants

# Make exit work as expected
type(exit).__repr__ = type(exit).__call__

Comment cela marche-t-il?

La ligne de commande python est une boucle de lecture-évaluation-impression, c'est-à-dire que lorsque vous tapez du texte, elle lira ce texte, l'évaluera et finira par imprimer le résultat.

Lorsque vous tapez, exit()il évalue un objet appelable de type site.Quitteret appelle sa __call__fonction qui quitte le système. Lorsque vous tapez, exitil évalue le même objet appelable, sans l'appeler, l'objet est imprimé qui à son tour appelle __repr__l'objet.

Nous pouvons en profiter en établissant un lien __repr__vers __call__et ainsi obtenir le comportement attendu de la sortie du système même lorsque nous tapons exitsans parenthèses.

Akuhn
la source
4
Ils ont pris l'effort de faire exitimprimer la chaîne "utile", mais ils ne pouvaient pas simplement la lier pour faire la chose naturelle et quitter l'interpréteur. Être obligé de taper les parenthèses à chaque fois est frustrant. Cette réponse est parfaite et devrait être acceptée à la place.
Przemek D
3

Pour quitter le terminal Python , faites simplement:

exit()

Veuillez faire attention que c'est une fonction qui a été appelée comme la plupart des utilisateurs la mélangent avec exit sans appeler, mais le nouveau terminal Pyhton affiche un message ...

ou comme raccourci, appuyez sur:

Ctrl + D

sur votre clavier ...

ctrl + D

Alireza
la source
1
Tout ce que vous avez dit a déjà été traité dans les réponses ci-dessus.
Przemek D
0

Si vous êtes coincé dans la ligne de commande python et qu'aucune des solutions ci-dessus ne fonctionne pour vous, essayez exit(2)

Mahdi Baghbani
la source
-1

"exit" est un nom de variable valide qui peut être utilisé dans votre programme Python. Vous ne voudriez pas quitter l'interpréteur lorsque vous essayez simplement de voir la valeur de cette variable.

Chad Kennedy
la source
Sauf si vous attribuez à exit, vous remplacez ce symbole et exit()ne fonctionnera plus. Bien que ce symbole soit un nom de variable valide, l'utiliser de cette manière ne semble pas être une très bonne pratique.
Przemek D