Python для Windows: почему это не работает?

Я пытаюсь что-то вроде этого

Output.py

print "Hello"

Input.py

greeting = raw_input("Give me the greeting. ")
print "The greeting is:", greeting

В строке cmd

Output.py | Input.py

Но он возвращает EOFError. Может ли кто-нибудь сказать мне, что я делаю неправильно?

Спасибо за вашу помощь.

ИЗМЕНИТЬ
Patrick Harrington , но я не знаю, почему...

Ответ 1

Я протестировал это на своей машине Windows, и он работает, если вы укажете exe python:

C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py
Give me the greeting. The greeting is: hello

Но я получаю EOFError также, если вы запускаете команды непосредственно как:

output.py | input.py 

Я точно не знаю, почему это так, я все еще смотрю на это, но, по крайней мере, это покажет вам обходной путь. Возможно, это связано с тем, как вызывается обработчик файлов для .py файлов.

ОБНОВЛЕНИЕ: ну, что вы знаете. Похоже, это на самом деле ошибка в Windows, где перенаправление stdin/stdout может не работать должным образом при запуске из ассоциации файлов. Итак, обходной путь, как заметил я и Патрик, вам нужно указать, что "python" будет работать с input.py, иначе он не будет перенаправлять stdout с output.py на stdin для input.py правильно.

Ссылка:

http://mail.python.org/pipermail/python-bugs-list/2004-August/024923.html

http://support.microsoft.com/default.aspx?kbid=321788

ОБНОВЛЕНИЕ 2:

Чтобы изменить это поведение и заставить Windows-трубы работать как ожидалось для перенаправления stdin/stdout, вы можете добавить это значение в реестр (проверено на моем ящике и проверено это работает по желанию).

  • Запустите редактор реестра.
  • Найдите и выделите следующий раздел реестра:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer,

  • В меню "Правка" выберите "Добавить значение", а затем добавьте следующее значение реестра:

    Имя значения: InheritConsoleHandles
      Тип данных: REG_DWORD
      Radix: Decimal
      Данные значения: 1

  • Закройте редактор реестра.

Ответ 2

Измените его на:

Output.py | python Input.py

Выход будет:

Дайте мне приветствие. Приветствие: hello

Ответ 3

Вот почему вы получаете EOFError (из документации по raw_input):

Затем функция считывает строку из ввод, преобразует его в строку (снятие конечной новой строки) и возвращает это. Когда EOF считывается, EOFError поднят.

http://docs.python.org/library/functions.html?highlight=raw_input#raw_input

Вы можете использовать sys.stdin, он предоставляет объект файла, из которого вы можете использовать методы чтения, чтения.

import sys
for greeting_line in sys.stdin.readlines():
    print "The greeting is:", greeting_line.strip()