У меня есть app
, который читает вещи из stdin
и возвращает после новой строки результаты stdout
Простой (глупый) пример:
$ app
Expand[(x+1)^2]<CR>
x^2 + 2*x + 1
100 - 4<CR>
96
Открытие и закрытие app
требует большой инициализации и очистки (это интерфейс к компьютерной алгебраической системе), поэтому я хочу, чтобы это было минимальным.
Я хочу открыть канал в Python для этого процесса, записать строки в его stdin
и прочитать результаты из stdout
. Popen.communicate()
не работает для этого, так как закрывает дескриптор файла, требуя заново открыть канал.
Я пробовал что-то подобное этому связанному вопросу:
Многократно общаться с процессом без разрыва канала? но я не уверен, как ждать вывода. Также сложно априори знать, сколько времени займет app
, чтобы завершить обработку входного сигнала, поэтому я не хочу делать никаких предположений. Я думаю, что большая часть моей путаницы возникает из-за этого вопроса: Неблокирующее чтение в подпроцессе. ТРУБА в python , где указано, что смешивание функций высокого и низкого уровня не является хорошей идеей.
EDIT :
Извините, что я не дал никакого кода раньше, меня прервали. Это то, что я пробовал до сих пор, и, похоже, это работает, я просто волнуюсь, что что-то идет не так незамеченным:
from subprocess import Popen, PIPE
pipe = Popen(["MathPipe"], stdin=PIPE, stdout=PIPE)
expressions = ["Expand[(x+1)^2]", "Integrate[Sin[x], {x,0,2*Pi}]"] # ...
for expr in expressions:
pipe.stdin.write(expr)
while True:
line = pipe.stdout.readline()
if line != '':
print line
# output of MathPipe is always terminated by ';'
if ";" in line:
break
Потенциальные проблемы с этим?