Я пытаюсь загрузить внешнюю программу командной строки с помощью Python и связываться с ней через каналы. Программа принимает текстовый ввод через stdin и производит вывод текста в строках в stdout. Коммуникация должна быть асинхронной, используя 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)