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.

32
demandé sur CharlesB 2012-09-23 01:02:53

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.

Github page for SublimeREPL

33
répondu Raghav Mujumdar 2013-09-03 12:39:20

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 .

10
répondu nneonneo 2017-05-23 12:02:17

help(input) montre ce que les raccourcis clavier produisent EOF, à savoir, Unix: Ctrl-D , Windows: Ctrl-Z+retour :

"1519120920 d'entrée" ([prompt]) -> string

lire 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

9
répondu jfs 2012-09-23 04:19:11

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.

5
répondu Matthew R. 2015-04-21 21:24:37
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]

-2
répondu Vatsal 2015-10-03 10:13:55