如何在Mac OS X中处理python中原始输入()的EOFError

如何在Mac OS X中处理python中原始输入()的EOFError,python,macos,eof,eoferror,Python,Macos,Eof,Eoferror,我的python程序有两个调用raw\u input() 第一个raw\u input()是从用户获取多行输入。用户可以在输入结束时发出Ctrl+D(windows中为Ctrl+Z) 第二个原始输入() 不幸的是(仅在Mac OS X中?),当stdin在第一次raw\u input()提示时终止(使用Ctrl+D),第二次raw\u input()将引发eoferor 请参阅下面的示例代码以了解更多解释- mailBody = '' signature = 'Later!' print 'Co

我的python程序有两个调用
raw\u input()

第一个
raw\u input()
是从用户获取多行输入。用户可以在输入结束时发出Ctrl+D(windows中为Ctrl+Z)

第二个
原始输入()

不幸的是(仅在Mac OS X中?),当stdin在第一次
raw\u input()
提示时终止(使用Ctrl+D),第二次
raw\u input()将引发
eoferor

请参阅下面的示例代码以了解更多解释-

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
-1-abhinay@MacBook代码/py%python prompt.py
撰写您的邮件:
你好!
大家好吗?
是否要在邮件中添加签名?(是/否):回溯(最近一次呼叫最后一次):
文件“prompt.py”,第11行,在
opt=raw_输入(“您想在邮件中添加签名吗?(y/N):”)。lower()
伊奥费罗
如何进行第二次提示以不提出
EOFError
。请帮忙

编辑:

我对我的问题进行了编辑,使其保持简单


我在Linux系统中运行了上述代码,它可以正常工作。也就是说,在第二个原始输入()时提示用户接收“(y/N)”选项。

当标准输入终止时(在Unix派生系统中,通过点击control-D,我认为它在Windows中是control-Z),它会在此后保持终止状态(当然,除非同时关闭并重新打开它).

@Alex感谢您的回复!这是否意味着,一旦我们输入^D(EOF),终端会一直向提示符发送EOF?有没有办法在Python中处理这个异常?正如您所见,在发出“撰写您的邮件:”提示后,我需要从用户(即y/n)处再收到一个输入。我想您误解了这个答案。当您点击control-D时,您正在关闭标准输入。这意味着,在程序的剩余生命周期中,如果没有解决方法,您将无法再向程序输入任何内容。@谢谢!现在有道理了。但是,对于我的上述场景,还有解决方法吗?还是我遗漏了什么?@abhiomkar,一个“解决办法”是在
之后重新打开标准输入(
sys.stdin
),而
(我认为与当前终端相对应的“文件”的名称在Windows命令shell上是
'CON:'
,在Mac等Unix-y机器上是
'/dev/tty'
)。更简单的方法是让用户使用除关闭标准输入之外的其他方法来告诉您他已经完成了(Unix-y经典是一行只包含一个句号字符
,然后立即换行/换行结束),这样标准输入仍然可用!我刚刚在Linux系统中运行了上面的代码,它可以正常工作。也就是说,在第二个raw_input()处提示用户接收“(y/N)”选项。将尝试实施您对Mac OS X终端的建议。谢谢