2012-09-22 99 views
32
while True: 
    reply = input('Enter text') 
    if reply == 'stop': break 
    print(reply.upper()) 

El resultado fue:Python 3: EOF cuando se lee una línea (Sublime Text 2 está enfadado)

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] 

Es sólo en Sublime Text 2. He intentado IDLE, comando tratado línea, todo es perfecto. ¿Por qué debería Subleme gritarme?

Por cierto, quizás también podría explicarme qué puede significar EOF en tal situación. Por supuesto, he leído en la documentación que si se lee el EOF de la entrada, se genera el error apropiado. Me gustaría modelar esta situación. ¿La entrada es solo sobre el teclado? En caso afirmativo, ¿qué combinación de teclas debo ingresar para obtener EOF?

Gracias de antemano.

+0

No estoy seguro del resto de su pregunta, pero EOF suele ser 'ctrl' +' D' – AGS

Respuesta

10

EOF es una señal especial fuera de banda que significa el final de la entrada. No es un personaje (aunque en los viejos días de DOS, 0x1B actuó como EOF), sino más bien una señal del sistema operativo de que la entrada ha finalizado.

En Windows, puede "ingresar" un EOF presionando Ctrl+Z en el símbolo del sistema. Esto indica al terminal que cierre el flujo de entrada, que presenta un EOF al programa en ejecución. Tenga en cuenta que en otros sistemas operativos o emuladores de terminal, EOF generalmente se señala utilizando Ctrl+D.

cuanto a su problema con Sublime Text 2, parece que stdin no está conectado a la terminal cuando se ejecuta un programa dentro de Sublime, y así en consecuencia los programas a empezar conectado a un archivo vacío (probablemente nul o /dev/null). Vea también Python 3.1 and Sublime Text 2 error.

+0

¿Hay alguna forma de conectar el stdin correctamente para que pueda ingresar al terminal? – TheTedinator

+0

Personalmente no uso Sublime, pero parece que la sugerencia principal es instalar [SublimeREPL] (http://sublimerepl.readthedocs.org/en/latest/). – nneonneo

9

help(input) muestra qué atajos de teclado producen EOF, a saber, Unix: Ctrl-D, Windows: Ctrl-Z + Retorno:

de entrada ([pronta]) -> string

Lee una cadena desde la entrada estándar. La nueva línea final se elimina. Si el usuario toca EOF (Unix: Ctl-D, Windows: Ctl-Z + Retorno), aumente EOFError. En Unix, GNU readline se usa si está habilitado. La cadena de solicitud , si se proporciona, se imprime sin una línea nueva posterior a la lectura .

Usted puede reproducirlo utilizando un archivo vacío:

$ touch empty 
$ python3 -c "input()" < empty 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
EOFError: EOF when reading a line 

Usted podría utilizar /dev/null o nul (Windows) como un archivo vacío para la lectura. os.devnull muestra el nombre que se utiliza por su sistema operativo:

$ python3 -c "import os; print(os.devnull)" 
/dev/null 

Nota: input() acepta felizmente entrada de un archivo/tubería.No es necesario stdin para ser conectado al terminal:

$ echo abc | python3 -c "print(input()[::-1])" 
cba 

cualquiera de las manijas EOFError en el código:

try: 
    reply = input('Enter text') 
except EOFError: 
    break 

o configurar su editor para proporcionar una entrada que no esté vacía cuando se ejecuta la secuencia de comandos por ejemplo, mediante el uso de una línea de comando personalizada si lo permite: python3 "%f" < input_file

32

Tuve el mismo problema. El problema con la consola predeterminada de Sublime Text es que no admite entrada.

Para resolverlo, debe instalar un paquete llamado SublimeREPL. SublimeREPL proporciona un intérprete de Python que acepta entradas.

Hay un article que explica la solución en detalle.

GitHub page for SublimeREPL

5

Parece a partir de ahora, la única solución sigue siendo para instalar SublimeREPL.

Para extender la respuesta de Raghav, puede ser bastante molesto tener que ir al comando Herramientas-> SublimeREPL-> Python-> Ejecutar cada vez que desee ejecutar un script con la entrada, así que ideé una unión de teclas rápida que puede ser útil:

para activarlo, vaya a Preferencias-> Atajos de teclado - usuario, y copiar esta ahí:

[ 
    {"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" 
     } 
    }, 
] 

Naturalmente, sólo tendría que cambiar el argumento "claves" para cambia el atajo a lo que quieras.

-2
try: 
    value = raw_input() 
    do_stuff(value) # next line was found 
except (EOFError): 
    break #end of file reached 

Este parece ser el uso adecuado de raw_input cuando se trata de la final de la secuencia de entrada desde una tubería. [Consulte esta publicación] [1]

Cuestiones relacionadas