Python 3: EOF lors de la lecture d'une ligne (texte Sublime 2 est en colère)
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.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 le texte Sublime 2. J'ai essayé le ralenti, essayé la ligne de commande, tout est parfait. Pourquoi Subleme me crierait-il dessus?
au fait, peut-être pourriez-vous aussi m'expliquer ce que L'EOF peut signifier dans une telle situation. Bien sûr, j'ai lu dans la documentation que si L'on lit L'EOF à partir des entrées, l'erreur appropriée est soulevée. Je voudrais modéliser cette situation. Être entrée uniquement sur le clavier? Si oui, quelle combinaison de touches dois-je entrer pour obtenir EOF?
Merci d'avance.
5 réponses
j'ai eu le même problème. Le problème avec la console par défaut de Sublime Text est qu'elle ne supporte pas l'entrée.
pour le résoudre, vous devez installer un paquet appelé SublimeREPL. SublimeREPL fournit un interpréteur Python qui accepte les entrées.
il y a un article qui explique la solution en détail.
EOF est un signal hors bande spécial qui signifie la fin de l'entrée. Ce n'est pas un caractère (bien que dans les vieux DOS jours, 0x1B agi comme EOF), mais plutôt un signal de L'OS que l'entrée a terminé.
sur 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 courant. Notez que sur les autres émulateurs D'os ou de terminaux, L'EOF est habituellement signalé en utilisant Ctrl+D
.
quant à votre problème avec Sublime Text 2, il semble que stdin
n'est pas connecté au terminal lors de l'exécution d'un programme dans Sublime, et par conséquent les programmes commencent connectés à un fichier vide (probablement nul
ou /dev/null
). Voir aussi Python 3.1 et L'erreur Sublime Text 2 .
help(input)
montre ce que les raccourcis clavier produisent EOF, à savoir, Unix: Ctrl-D , Windows: Ctrl-Z+retour :
"1519120920 d'entrée" ([prompt]) -> stringlire une chaîne de caractères à partir d'une entrée standard. La dernière ligne est dépouillée. Si l'utilisateur tape EOF (Unix: Ctl - D, Windows: Ctl-Z+Return), il relance EOFError. Sur Unix, GNU readline est utilisé si activé. Invite chaîne, si donné, est imprimé sans une nouvelle ligne arrière avant 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) comme un fichier vide pour la lecture. os.devnull
montre le nom qui est utilisé par votre OS:
$ python3 -c "import os; print(os.devnull)"
/dev/null
Note: input()
accepte volontiers les entrées d'un fichier / pipe. Vous n'avez pas besoin de stdin
pour être connecté terminal:
$ echo abc | python3 -c "print(input()[::-1])"
cba
manier EOFError
dans votre code:
try:
reply = input('Enter text')
except EOFError:
break
ou configurer votre éditeur pour fournir une entrée non vide quand il exécute votre script, par exemple, en utilisant une ligne de commande personnalisée si elle le permet: python3 "%f" < input_file
il semble qu'à partir de maintenant, la seule solution soit encore D'installer SublimeREPL.
pour étendre sur la réponse de Raghav, il peut être assez ennuyeux d'avoir à aller dans les outils- > SublimeREPL - > commande Python - >Run chaque fois que vous voulez exécuter un script avec input, donc j'ai conçu une liaison de clé rapide qui peut être pratique:
pour l'activer, allez dans Preferences- > Key Bindings-User, et copiez là:
[
{"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, vous voulez il suffit de changer l'argument "clés" pour changer le raccourci à ce que vous voulez.
try:
value = raw_input()
do_stuff(value) # next line was found
except (EOFError):
break #end of file reached
Cela semble être la bonne utilisation de raw_input lorsque vous traitez avec la fin du flux d'entrée de canalisations d'entrée. [Consulter ce post][1]