【问题标题】:How to Handle EOFError for raw_input() in python in Mac OS X如何在 Mac OS X 中处理 Python 中 raw_input() 的 EOFError
【发布时间】:2011-01-12 23:07:32
【问题描述】:

我的 python 程序有两次调用 raw_input()

第一个raw_input() 是接受用户的多行输入。用户可以发出 Ctrl+D(在 Windows 中为 Ctrl+Z)来结束输入。

第二个raw_input() 应该使用 (y/n) 类型提示从用户那里获取另一个输入。

不幸的是(仅在 Mac OS X 中?),当 stdin 在第一个 raw_input() 提示符处终止(使用 Ctrl+D)时,第二个 raw_input() 引发 EOFError

请参阅下面的示例代码以获取更多说明-

mailBody = ''
signature = 'Later!'
print 'Compose your mail:'
while True:
    try:
        # Hit ^D after entering some text
        mailBody+= raw_input()
        mailBody+='\n'
    except EOFError:
        break

# This raw_input() throws EOFError too. Because, stdin is terminated for the session
# when EOF (^D) is issues at first raw_input() method (Where as, it doesn't raise EOFError in Linux)
opt = raw_input("Do you want to add signature to your mail? (y/N): ").lower()
print '-'*10+'Your Mail'
if opt == 'y':
    print mailBody+"\n"+signature
else:
    print mailBody
print '-'*19

程序输出:

-1- abhinay@MacBook code/py % python prompt.py                                                        
Compose your mail:
hello there!
how is everybody?
Do you want to add signature to your mail? (y/N): Traceback (most recent call last):
  File "prompt.py", line 11, in <module>
    opt = raw_input("Do you want to add signature to your mail? (y/N): ").lower()
EOFError

我怎样才能让第二个提示不要提出EOFError。请帮忙!

编辑:

为了简单起见,我已经编辑了我的问题。

我在 Linux 系统中运行了上面的代码,它没有任何问题。也就是说,在第二个 raw_input() 处提示用户接收 '(y/N)' 选择。

【问题讨论】:

    标签: python macos eof eoferror


    【解决方案1】:

    当标准输入终止时(在 Unix 派生系统中通过按 control-D ——我认为在 Windows 中是 control-Z),它保持终止是很正常的(除非你当然,在此期间关闭并重新打开它)。

    【讨论】:

    • @Alex 感谢您的回复!这是否意味着,一旦我们输入 ^D (EOF),终端就会一直发送 EOF 到提示符?有没有办法在 Python 中处理这个异常?如您所见,在发出“撰写您的邮件:”提示后,我需要从用户那里再收到一个输入(即是/否)。
    • 我认为您误解了这个答案。当您按下 control-D 时,您将关闭标准输入。这意味着如果没有一些解决方法,您将无法再在程序的剩余生命周期内向程序输入任何内容。
    • @Clueless 谢谢!现在说得通了。但是,我的上述情况仍然有解决方法吗?还是我错过了什么?
    • @abhiomkar,一种“解决方法”是在while 之后重新打开标准输入(sys.stdin)(我认为当前终端对应的“文件”的名称是'CON:'在 Windows 命令 shell 上,'/dev/tty' 在 Unix-y 机器(例如 Mac)上)。更简单的是让用户使用一些 other 手段而不是关闭标准输入来告诉你他已经完成了(Unix-y 经典是一行只包含句号字符'.' 然后立即换行/end-of-line),以便标准输入保持可用!
    • 我刚刚在 Linux 系统中运行了我上面的代码,它没有任何问题。也就是说,在第二个 raw_input() 处提示用户接收“(y/N)”选择。将尝试实施您对 Mac OS X 终端的建议。谢谢。
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多