如何在Mac OS X的python中处理raw_input()的EOFError

abh*_*kar 4 python macos eof eoferror

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

第一种raw_input()是从用户那里获取多行输入.用户可以在输入结束时发出Ctrl + D(在Windows中为Ctrl + Z).

第二个raw_input()应该从用户使用(y/n)类型提示输入另一个输入.

不幸的是(在Mac OS X仅?),第二raw_input()提升EOFError当标准输入在第一终止(用Ctrl + d)raw_input()提示.

有关更多说明,请参阅下面的示例代码 -

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
Run Code Online (Sandbox Code Playgroud)

程序输出:

-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
Run Code Online (Sandbox Code Playgroud)

我该怎么做第二次提示不要加注EOFError.请帮忙!

编辑:

我编辑了我的问题以保持简单.

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

Ale*_*lli 6

当标准输入终止时(通过命中控制-D,在Unix衍生系统中 - 我认为它是Windows中的控制-Z),这很正常,此后它会保持终止(除非你在此期间关闭并重新打开它,当然).

  • @abhiomkar,一个"解决方法"是在`while`之后重新打开标准输入(`sys.stdin`)(我认为对应于当前终端的"文件"的名称是''CON:'`在Windows上命令shell,在Unix-y机器上的'//dev/tty'`,如Mac).更简单的方法是让用户使用一些_other_方法,而不是关闭标准输入来告诉你他已经完成了(Unix-y classic是一行只包含一个句号的''.'`然后立即换行/结束 - 线),以便标准输入保持可用! (3认同)