2009-06-08 4 views
16

Я пытаюсь читать строки из трубы и обрабатывать их, но я делаю что-то глупое, и я не могу понять, что. Производитель собирается продолжать производить линии до бесконечности, как это:Python - простые строки чтения из трубы

producer.py

import time 

while True: 
    print 'Data' 
    time.sleep(1) 

Потребитель просто необходимо проверить линии периодически:

consumer.py

import sys, time 
while True: 
    line = sys.stdin.readline() 
    if line: 
     print 'Got data:', line 
    else: 
     time.sleep(1) 

Когда я запускаю это в оболочке Windows как python producer.py | python consumer.py, он просто спит навсегда (никогда не получается получить данные?) Кажется, что, возможно, проблема в том, что prod ucer никогда не заканчивается, поскольку, если я отправляю конечный объем данных, тогда он работает нормально.

Как я могу получить данные, которые будут получены и отображаться для потребителя? В реальном приложении производитель - это программа на C++, над которой я не контролирую.

ответ

16

Некоторые старые версии Windows моделировали трубы через файлы (поэтому они были подвержены таким проблемам), но это не было проблемой через 10 лет. Попробуйте добавить

sys.stdout.flush() 

к производителю после print, а также попытаться сделать стандартный вывод продюсера небуферизован (с помощью python -u).

Конечно, это не поможет, если у вас нет контроля над продюсером - если он слишком сильно загружает свой результат, вы все равно будете долго ждать.

К сожалению, - в то время как существует множество подходов для решения этой проблемы на Unix-подобные операционные системы, такие как pyexpect, pexpect, exscript и paramiko, я сомневаюсь, что любой из них работает на Windows; если это действительно так, я бы попробовал Cygwin, что накладывает достаточное количество подобной Linux-шпона на Windows, что позволяет часто использовать Linux-подобные подходы в окне Windows.

7

Речь идет об I/O, который по умолчанию используется для буферизации с помощью Python. Pass -u возможности переводчика отключить такое поведение:

python -u producer.py | python consumer.py 

Он исправляет проблему для меня.

+0

Вы прочитали последнее предложение вопроса? – jwg

Смежные вопросы