Я пробую что-то вроде этого
Output.py
print "Hello"
Input.py
greeting = raw_input("Give me the greeting. ")
print "The greeting is:", greeting
В строке cmd
Output.py | Input.py
Но он возвращает EOFError. Может кто-нибудь сказать мне, что я делаю не так?
Спасибо за вашу помощь.
РЕДАКТИРОВАТЬ
Патрик Харрингтон решение работает, но я не знаю почему ...
Я обновил свой ответ, чтобы объяснить, почему решение, которое мы с Патриком предложили, работает, а оригинал - нет.
обновлен снова с помощью альтернативного решения (добавление раздела реестра), чтобы избежать необходимости указывать исполняемый файл python при вызове input.py






Я тестировал это на своем компьютере с Windows, и он работает, если вы укажете Python exe:
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, вы можете добавить это значение в реестр (протестировано на моем компьютере и подтвердило, что это работает должным образом).
- Start Registry Editor.
Locate and then click the following key in the registry:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
On the Edit menu, click Add Value, and then add the following registry value:
Value name: InheritConsoleHandles
Data type: REG_DWORD
Radix: Decimal
Value data: 1Quit Registry Editor.
Стоит отметить, что теперь вы можете добавить значение InheritConsoleHandles в реестр Windows, чтобы использовать output.py | input.py, как описано на связанной странице microsoft.com.
Измените его на:
Output.py | python Input.py
Результатом будет:
Give me the greeting. The greeting is: hello
Вот почему вы получаете ошибку EOFError (из документации на raw_input):
The function then reads a line from input, converts it to a string (stripping a trailing newline), and returns that. When EOF is read, EOFError is raised.
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()
То есть я использовал input (..) вместо raw_input (..)