36
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]

它只在 Sublime Text 2 中。我试过 IDLE,试过命令行,一切都很完美。Subleme 为什么要冲我大喊大叫?

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

先感谢您。

4

5 回答 5

36

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

为了解决这个问题,你必须安装一个名为 SublimeREPL 的包。SublimeREPL 提供了一个接受输入的 Python 解释器。

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

SublimeREPL 的 GitHub 页面

于 2013-03-14T18:49:33.210 回答
11

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

输入([提示])-> 字符串

从标准输入中读取字符串。尾随换行符被剥离。如果用户点击 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

您可以使用/dev/nullor nul(Windows) 作为空文件进行读取。os.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

于 2012-09-23T04:19:11.690 回答
10

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

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

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

于 2012-09-23T01:15:41.230 回答
5

目前看来,唯一的解决方案仍然是安装 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”参数即可将快捷方式更改为您想要的任何内容。

于 2015-04-21T21:24:37.727 回答
-2
try:
    value = raw_input()
    do_stuff(value) # next line was found 
except (EOFError):
   break #end of file reached

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

于 2015-10-03T10:13:55.567 回答