【问题标题】:Python 3: EOF when reading a line (Sublime Text 2 is angry)Python 3:读取一行时的 EOF(Sublime Text 2 很生气)
【发布时间】:2012-09-14 21:19:51
【问题描述】:
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?

提前谢谢你。

【问题讨论】:

  • 不确定您的其余问题,但 EOF 通常为 ctrl + D

标签: python python-3.x sublimetext2 eof


【解决方案1】:

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

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

关于 Sublime Text 2 的问题,在 Sublime 中运行程序时,stdin 似乎没有连接到终端,因此程序开始连接到一个空文件(可能是 nul 或 @987654327 @)。另见Python 3.1 and Sublime Text 2 error

【讨论】:

  • 有没有办法正确连接标准输入,以便您可以输入到终端?
  • 我个人不使用 Sublime,但似乎主要的建议是安装 SublimeREPL
【解决方案2】:

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

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

从标准输入中读取一个字符串。尾随换行符被剥离。 如果用户点击 EOF(Unix:Ctl-D,Windows:Ctl-Z+Return),则引发 EOF错误。在 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/nullnul (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" &lt; input_file

【讨论】:

    【解决方案3】:

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

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

    有一个article详细解释了解决方案。

    GitHub page for SublimeREPL

    【讨论】:

    • 文章链接失效了,我觉得你应该检查一下
    【解决方案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”参数即可将快捷方式更改为您想要的任何内容。

    【讨论】:

      【解决方案5】:
      try:
          value = raw_input()
          do_stuff(value) # next line was found 
      except (EOFError):
         break #end of file reached
      

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

      【讨论】:

        猜你喜欢
        • 2021-03-10
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2014-06-06
        • 2016-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多