web-dev-qa-db-fra.com

Python 3: EOF lors de la lecture d'une ligne (Sublime Text 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\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.

33
Kifsif

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.

page GitHub pour SublimeREPL

35
Raghav Mujumdar

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

10
jfs

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 .

10
nneonneo

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.

5
Matthew R.