Конвейер Python в Windows:Почему это не работает?

StackOverflow https://stackoverflow.com/questions/466801

  •  19-08-2019
  •  | 
  •  

Вопрос

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

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 и подтверждено, что это работает должным образом).

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

    HKEY_LOCAL_MACHINE\Программное обеспечение\Microsoft\Windows\CurrentVersion\Политики\Проводник

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

    Имя значения: Унаследовать дескрипторы CONSOLEHANDLES
    Тип данных: REG_DWORD - РЕГ_СЛОВО
    Основание:Десятичная дробь
    Данные о значении:1

  4. Выйдите из редактора реестра.

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

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

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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top