Как обработать EOFError для raw_input () в python в Mac OS X - PullRequest
4 голосов
/ 04 февраля 2010

В моей программе на Python есть два вызова raw_input()

Первый raw_input() - принять многострочный ввод от пользователя. Пользователь может выполнить Ctrl + D (Ctrl + Z в окнах) для конца ввода.

Второй raw_input() должен получить другой ввод от пользователя с подсказкой типа (y / n).

К сожалению (только в Mac OS X?), Второй raw_input() вызывает EOFError, когда stdin завершается (с помощью 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

Вывод программы:

-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. Пожалуйста, помогите!

EDIT:

Я отредактировал свой вопрос, чтобы сделать его простым.

Я запустил приведенный выше код в системе Linux, он работает без проблем. То есть пользователю было предложено во втором raw_input () получить выбор '(y / N)'.

1 Ответ

6 голосов
/ 04 февраля 2010

Вполне нормально, что когда стандартный ввод завершается (при нажатии control-D в системах, основанных на Unix - я думаю, что это control-Z в Windows), он остается прекращенным после этого (если вы не закроетеи, конечно же, снова откройте его).

...