Трубопровод 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. Может кто-нибудь сказать мне, что я делаю не так?

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

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

То есть я использовал input (..) вместо raw_input (..)

Lasse V. Karlsen 21.01.2009 23:31

Я обновил свой ответ, чтобы объяснить, почему решение, которое мы с Патриком предложили, работает, а оригинал - нет.

Jay 21.01.2009 23:38

обновлен снова с помощью альтернативного решения (добавление раздела реестра), чтобы избежать необходимости указывать исполняемый файл python при вызове input.py

Jay 21.01.2009 23:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
11
3
5 705
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я тестировал это на своем компьютере с 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. Start Registry Editor.
  2. Locate and then click the following key in the registry:

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

  3. 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: 1

  4. Quit Registry Editor.

Стоит отметить, что теперь вы можете добавить значение InheritConsoleHandles в реестр Windows, чтобы использовать output.py | input.py, как описано на связанной странице microsoft.com.

jfs 21.01.2009 23:49

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

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()

Другие вопросы по теме