Конвейер 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
Но это возвращает Ошибка.Кто-нибудь может сказать мне, что я делаю не так?
Спасибо за вашу помощь.
Редактировать
Патрик Харрингтон решение работает, но я не знаю почему...
Решение
Я протестировал это на своем компьютере с 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, иначе он не будет перенаправлять стандартный вывод из output.py в стандартный файл для 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, вы можете добавить это значение в реестр (протестировано на my box и подтверждено, что это работает должным образом).
- Запустите редактор реестра.
Найдите и затем щелкните следующий раздел в реестре:
HKEY_LOCAL_MACHINE\Программное обеспечение\Microsoft\Windows\CurrentVersion\Политики\Проводник
В меню Правка выберите Добавить значение, а затем добавьте следующее значение реестра:
Имя значения: Унаследовать дескрипторы CONSOLEHANDLES
Тип данных: REG_DWORD - РЕГ_СЛОВО
Основание:Десятичная дробь
Данные о значении:1Выйдите из редактора реестра.
Другие советы
Измените его на:
Output.py | python Input.py
Результатом будет:
Передай мне приветствие.Приветствие таково:здравствуйте
Вот почему вы получаете EOFError (из документации по raw_input):
Затем функция считывает строку из входных данных, преобразует ее в строку (удаляя завершающий символ новой строки) и возвращает это.Когда EOF считывается, Возникает ошибка EOFError.
http://docs.python.org/library/functions.html ?выделить=raw_input#raw_input
Возможно, вы захотите использовать sys.стандартный код, он предоставляет файловый объект, из которого вы можете использовать методы read, readlines.
import sys
for greeting_line in sys.stdin.readlines():
print "The greeting is:", greeting_line.strip()