Python 3:读取一行时出现EOF(Sublime Text 2很生气)
- 2025-03-06 08:51:00
- admin 原创
- 63
问题描述:
while True:
reply = input('Enter text')
if reply == 'stop': break
print(reply.upper())
结果是:
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]
它只在 Sublime Text 2 中存在。我尝试了 IDLE,尝试了命令行,一切都很完美。Subleme 为什么要对我大喊大叫?
顺便说一句,也许您也可以解释一下在这种情况下 EOF 可能意味着什么。当然,我在文档中读到,如果从输入中读取 EOF,则会引发相应的错误。我想模拟这种情况。输入仅与键盘有关吗?如果是,我应该输入什么组合键才能获得 EOF?
先感谢您。
解决方案 1:
我也遇到了同样的问题。Sublime Text 的默认控制台的问题是它不支持输入。
为了解决这个问题,你必须安装一个名为 SublimeREPL 的包。SublimeREPL 提供了一个接受输入的 Python 解释器。
有一篇文章详细解释了解决方案。
SublimeREPL 的 GitHub 页面
解决方案 2:
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/null
或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
解决方案 3:
EOF 是一种特殊的带外信号,表示输入结束。它不是一个字符(尽管在旧的 DOS 时代,0x1B 的作用类似于 EOF),而是来自操作系统的表示输入已结束的信号。
在 Windows 上,您可以通过在命令提示符下按 来“输入”EOF Ctrl+Z
。这会向终端发出信号以关闭输入流,从而向正在运行的程序显示 EOF。请注意,在其他操作系统或终端仿真器上,通常使用 来发出 EOF 信号Ctrl+D
。
至于您在 Sublime Text 2 中遇到的问题,似乎stdin
在 Sublime 中运行程序时未连接到终端,因此程序开始时连接到一个空文件 (可能是nul
或/dev/null
)。另请参阅Python 3.1 和 Sublime Text 2 错误。
解决方案 4:
截至目前,唯一的解决方案仍然是安装 SublimeREPL。
为了扩展 Raghav 的回答,每次想要运行带有输入的脚本时都必须进入 Tools->SublimeREPL->Python->Run 命令,这可能会很烦人,因此我设计了一个可能方便的快捷键绑定:
要启用它,请转到“首选项”->“键绑定 - 用户”,并将其复制到其中:
[
{"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"
}
},
]
当然,您只需改变“键”参数即可将快捷方式更改为您想要的任何内容。
解决方案 5:
try:
value = raw_input()
do_stuff(value) # next line was found
except (EOFError):
break #end of file reached
在处理管道输入的输入流末尾时,这似乎是 raw_input 的正确用法。参考这篇文章
扫码咨询,免费领取项目管理大礼包!