Я пытаюсь загрузить внешнюю программу командной строки с помощью 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)