Python 3:读一行时的 EOF(Sublime Text 2 很生气)

Python 3: EOF when reading a line (Sublime Text 2 is angry)

提问人:Kifsif 提问时间:9/23/2012 最后编辑:CharlesBKifsif 更新时间:10/17/2016 访问量:127610

问:

while True:
    reply = input('Enter text')
    if reply == 'stop': break
    print(reply.upper())

结果是:

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]

它只在崇高文本 2 中。我尝试了 IDLE,尝试了命令行,一切都很完美。 Subleme为什么要对我大喊大叫?

顺便说一句,也许你也可以解释一下我在这种情况下EOF可能意味着什么。当然,我已经在文档中读到,如果从输入中读取 EOF,则会引发相应的错误。我想对这种情况进行建模。输入是否仅与键盘有关?如果是,我应该输入什么密钥组合才能获得 EOF?

先谢谢你。

python-3.x sublimetext2 eof

评论

0赞 AGS 9/23/2012
不确定您问题的其余部分,但 EOF 通常是ctrl + D

答:

10赞 nneonneo 9/23/2012 #1

EOF是一种特殊的带外信号,表示输入结束。它不是一个字符(尽管在旧的DOS时代,0x1B表现得像EOF),而是来自操作系统的信号,表明输入已经结束。

在 Windows 上,您可以通过按命令提示符“输入”EOF。这会向终端发出关闭输入流的信号,从而向正在运行的程序提供 EOF。请注意,在其他操作系统或终端仿真器上,EOF 通常使用 发出信号。Ctrl+ZCtrl+D

至于您对 Sublime Text 2 的问题,在 Sublime 中运行程序时似乎没有连接到终端,因此程序开始连接到一个空文件(可能是或 )。另请参阅 Python 3.1 和 Sublime Text 2 错误stdinnul/dev/null

评论

0赞 TheTedinator 10/21/2012
有没有办法正确连接 stdin,以便您可以输入到终端中?
0赞 nneonneo 10/21/2012
我个人不使用 Sublime,但似乎主要的建议是安装 SublimeREPL
11赞 jfs 9/23/2012 #2

help(input)显示了产生 EOF 的键盘快捷键,即 Unix: , Windows: :Ctrl-DCtrl-Z+Return

input([prompt]) -> 字符串

从标准输入中读取字符串。尾随换行符被剥离。 如果用户点击 EOF(Unix:Ctl-D,Windows:Ctl-Z+Return),则引发 EOFError。在 Unix 上,如果启用,则使用 GNU readline。提示 字符串(如果给定)在打印时不带尾随换行符 读数。

您可以使用空文件重现它:

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

您可以使用 或 (Windows) 作为空文件进行阅读。 显示操作系统使用的名称:/dev/nullnulos.devnull

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

注意:愉快地接受来自文件/管道的输入。您无需连接到终端:input()stdin

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

代码中的任一句柄:EOFError

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

或者将编辑器配置为在运行脚本时提供非空输入,例如,如果允许,请使用自定义命令行:python3 "%f" < input_file

36赞 Raghav Mujumdar 3/15/2013 #3

我也有同样的问题。Sublime Text 的默认控制台的问题在于它不支持输入。

要解决它,您必须安装一个名为 SublimeREPL 的软件包。SublimeREPL提供了一个接受输入的Python解释器。

一篇文章详细解释了解决方案。

SublimeREPL 的 GitHub 页面

评论

1赞 MAZux 6/11/2018
文章的链接不再有效,我认为您应该检查一下
5赞 Matthew R. 4/22/2015 #4

截至目前,唯一的解决方案仍然是安装 SublimeREPL。

为了扩展 Raghav 的答案,每次你想运行带有输入的脚本时都必须进入 Tools->SublimeREPL->Python->Run 命令可能会很烦人,所以我设计了一个可能很方便的快速键绑定:

要启用它,请转到 Preferences->Key Bindings - User,然后将其复制到其中:

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

当然,您只需更改“keys”参数即可将快捷方式更改为您想要的任何内容。

-2赞 DoOrDoNot 10/3/2015 #5
try:
    value = raw_input()
    do_stuff(value) # next line was found 
except (EOFError):
   break #end of file reached

在处理来自管道输入的输入流的末尾时,这似乎是raw_input的正确用法。 [参考这篇文章][1]