Python: select () не сигнализирует обо всех входных данных из канала

Я пытаюсь загрузить внешнюю программу командной строки с помощью Python и общаться с ней через каналы. Программа принимает ввод текста через стандартный ввод и выводит текст в виде строк на стандартный вывод. Связь должна быть асинхронной с использованием select ().

Проблема в том, что не все выходные данные программы сигнализируются в select (). Обычно последние одна или две строки не сигнализируются. Если select () возвращается с тайм-аутом, и я все равно пытаюсь прочитать из конвейера, readline () немедленно возвращается со строкой, отправленной из программы. См. Код ниже.

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

Я пробовал Python 3.1 и 3.2 на Mac OSX 10.6.

import subprocess
import select

engine = subprocess.Popen("Engine", bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
engine.stdin.write(b"go\n")
engine.stdin.flush()

while True:
    inputready,outputready,exceptready = select.select( [engine.stdout.fileno()] , [], [], 10.0)

    if (inputready, outputready, exceptready) == ([], [], []):
        print("trying to read from engine anyway...")
        line = engine.stdout.readline()
        print(line)

     for s in inputready:
        line = engine.stdout.readline()
        print(line)
10
задан StefanMK 30 March 2011 в 13:24
поделиться