Ошибка EOF Python в raw_input () - PullRequest
       41

Ошибка EOF Python в raw_input ()

1 голос
/ 26 июля 2011

Я пытаюсь получить ввод от пользователя в командной строке. Программа считывает данные из текстового файла в формате «cat text.txt | ./thescript.py»

В момент написания сценария все данные уже были прочитаны, обработаны и помещены в список списков.

Теперь я перебираю этот список списков в поисках сомнительных предметов. Код в основном выглядит следующим образом:

for invoice in parsedlist:
      if invoice[-1] == 3:
          sys.stderr.write("triple duplicate at " + invoice[2]+' : ' + invoice[3]+"\n")
          sys.stderr.write("continue Y or N \n")
          answer = raw_input("Type your answer here")
          if answer == 'N':
              sys.exit(1)
          else: 
              pass`

Этот код приводит к ошибке EOFError. Из того, что я уже понимаю, в данном случае stdin - это чтение из cat, и поскольку он уже достиг EOF, поэтому raw_input получает EOF здесь? (Я думаю) Цель состоит в том, чтобы скрипт напечатал предупреждение о стандартной ошибке и позволил мне выбрать, игнорировать ли это предупреждение и продолжить или выйти полностью. В конце все выходные данные отправляются на стандартный вывод и не содержат никаких предупреждений об ошибках или ответов. Я видел примеры, которые используют попытку / исключение, но я не смог понять это в этом контексте. (Например, почему raw_input не ожидает ввода?)

Я думаю, что я могу просто атаковать эту проблему неправильно и, таким образом, создать проблему, которую можно лучше обойти, чем перепрыгнуть. Любая помощь ценится как всегда.

Ответы [ 3 ]

3 голосов
/ 26 июля 2011

Это работает под Windows (я проверил его, запустив python cons.py < cons.py и смог увидеть подсказку и не получить сообщение об ошибке EOF):

import sys

for line in sys.stdin:
    print line

sys.stdin = open('CON', 'r')
q = raw_input('---->')

В Unix вам, вероятно, просто нужно заменить 'CON' на что-то в / dev dir.

2 голосов
/ 26 июля 2011

Да, проблема в том, что ваш raw_input() читает со стандартного входа, который является выходом cat, который находится в EOF.

Мое предложение было бы устранить cat. Это не обязательно; Python отлично способен читать файлы самостоятельно. Передайте имя файла в командной строке, откройте его и прочитайте его самостоятельно.

import sys

for line in open(sys.argv[1]):
    # process line

Если вам нужно обработать несколько файлов, проверьте модуль fileinput; он легко обрабатывает чтение нескольких файлов, как если бы они были одним, что и делает для вас cat.

1 голос
/ 26 июля 2011

Цель состоит в том, чтобы скрипт напечатал предупреждение о стандартной ошибке и позволил мне выбрать, игнорировать ли предупреждение и продолжить или выйти полностью.

Вы хотите, чтобы выбор исходил из интерактивного приглашения, а данные поступают из файла? Что ж, теперь вы делаете что-то отличное от оригинальной программы: вы читаете эти две вещи из разных мест, откуда они раньше приходили из одного места. Поэтому вам нужно обновить свой дизайн, чтобы учесть это.

Почему raw_input не ожидает ввода

raw_input ждет столько времени, сколько необходимо для получения строки ввода. Если стандартный ввод перенаправляется из файла, то строки ввода всегда доступны сразу (ну, например, ограничены, например, скоростью жесткого диска), вплоть до EOF, после чего больше не будет доступно. Короче говоря, вам не нужно ждать ответа на вопрос по той же причине, по которой вам не нужно предоставлять данные счета-фактуры: потому что вы больше не являетесь источником данных после перенаправления из файла.

...