Python - простое чтение строк из трубы - PullRequest
16 голосов
/ 08 июня 2009

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

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

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

Ответы [ 2 ]

16 голосов
/ 08 июня 2009

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

  sys.stdout.flush()

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

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

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

7 голосов
/ 08 июня 2009

Это касается ввода-вывода, который по умолчанию буферизуется с помощью Python. Передайте интерпретатору параметр -u, чтобы отключить это поведение:

python -u producer.py | python consumer.py

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...