Python трубопровод на Windows: почему это не работает? - PullRequest
11 голосов
/ 21 января 2009

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

Output.py

print "Hello"

Input.py

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

На линии cmd

Output.py | Input.py

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

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

РЕДАКТИРОВАТЬ
Патрик Харрингтон решение работает, но я не знаю почему ...

Ответы [ 3 ]

23 голосов
/ 21 января 2009

Я протестировал это на моей машине с 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, вы можете добавить это значение в реестр (проверено на моем компьютере и проверено, работает ли оно как нужно).

  1. Запустите редактор реестра.
  2. Найдите и щелкните следующий ключ в реестре:

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

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

    Имя значения: InheritConsoleHandles
    Тип данных: REG_DWORD
    Корень: десятичный
    Значение данных: 1

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

4 голосов
/ 21 января 2009

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

Output.py | python Input.py

Вывод будет:

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

0 голосов
/ 22 января 2009

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

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

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

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

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