while True:
reply = input('Enter text')
if reply == 'stop': break
print(reply.upper())
Le résultat était:
Enter text:Traceback (most recent call last): File "C:\PythonProjects\5.py", line 2, in <module> reply = input('Enter text:') EOFError: EOF when reading a line [Finished in 0.2s with exit code 1]
Ce n'est que dans Sublime Text 2. J'ai essayé IDLE, essayé en ligne de commande, tout est parfait. Pourquoi Subleme devrait-il crier après moi?
En passant, peut-être pourriez-vous aussi expliquer ce que EOF peut signifier dans une telle situation. Bien sûr, j’ai lu dans la documentation que si EOF est Si vous lisez l'erreur, l'erreur appropriée est générée. J'aimerais modéliser cette situation. L'entrée concerne-t-elle uniquement le clavier? Si oui, quelle combinaison de touches dois-je entrer pour obtenir EOF?
Merci d'avance.
J'ai eu le même problème. Le problème avec la console par défaut de Sublime Text est qu’elle ne prend pas en charge la saisie.
Pour le résoudre, vous devez installer un package appelé SublimeREPL. SublimeREPL fournit un interpréteur Python qui accepte les entrées).
Il existe un article qui explique la solution en détail.
help(input)
montre quels raccourcis clavier produisent EOF, à savoir, Unix: Ctrl-D, Les fenêtres: Ctrl-Z+Return:
input ([Prompt]) -> string
Lire une chaîne à partir de l'entrée standard. La nouvelle ligne est supprimée. Si l'utilisateur appuie sur EOF (Unix: Ctl-D, Windows: Ctl-Z + Retour)), déclenchez EOFError. Sous Unix, GNU readline est utilisé si La chaîne d’invite, si elle est donnée, est imprimée sans nouvelle ligne avant la lecture.
Vous pouvez le reproduire en utilisant un fichier vide:
$ touch empty
$ python3 -c "input()" < empty
Traceback (most recent call last):
File "<string>", line 1, in <module>
EOFError: EOF when reading a line
Vous pouvez utiliser /dev/null
Ou nul
(Windows) en tant que fichier vide en lecture. os.devnull
Indique le nom utilisé par votre système d'exploitation:
$ python3 -c "import os; print(os.devnull)"
/dev/null
Remarque: input()
accepte volontiers les entrées d'un fichier/canal. Vous n'avez pas besoin de stdin
pour être connecté au terminal:
$ echo abc | python3 -c "print(input()[::-1])"
cba
Soit gérer EOFError
dans votre code:
try:
reply = input('Enter text')
except EOFError:
break
Ou configurez votre éditeur pour qu'il fournisse une entrée non vide lorsqu'il exécute votre script, par exemple, en utilisant une ligne de commande personnalisée s'il le permet: python3 "%f" < input_file
EOF est un signal spécial hors bande qui signifie la fin de l'entrée. Ce n'est pas un caractère (même si à l'époque du DOS, 0x1B agissait de la même manière que EOF), mais plutôt un signal de l'OS indiquant que l'entrée était terminée.
Sous Windows, vous pouvez "entrer" un EOF en appuyant sur Ctrl+Z
à l'invite de commande. Cela indique au terminal de fermer le flux d'entrée, ce qui présente un EOF au programme en cours. Notez que sur d'autres systèmes d'exploitation ou émulateurs de terminal, EOF est généralement signalé en utilisant Ctrl+D
.
En ce qui concerne votre problème avec Sublime Text 2, il semble que stdin
ne soit pas connecté au terminal lors de l’exécution d’un programme dans Sublime. Par conséquent, les programmes démarrent alors connectés à un fichier vide (probablement nul
ou /dev/null
). Voir aussi erreur Python 3.1 et Sublime Text 2 .
Il semble qu'à partir de maintenant, la seule solution consiste à installer SublimeREPL.
Pour prolonger la réponse de Raghav, il peut être assez ennuyant de devoir utiliser la commande Outils-> SublimeREPL-> Python-> Exécuter à chaque fois que vous souhaitez exécuter un script avec une entrée. J'ai donc conçu une liaison rapide pouvant être utile. :
Pour l'activer, allez dans Préférences-> Liaisons de touches - Utilisateur, et copiez-le ici:
[
{"keys":["ctrl+r"] ,
"caption": "SublimeREPL: Python - RUN current file",
"command": "run_existing_window_command",
"args":
{
"id": "repl_python_run",
"file": "config/Python/Main.sublime-menu"
}
},
]
Naturellement, il vous suffirait de changer l'argument "keys" pour changer le raccourci en ce que vous voulez.