Я пытаюсь поговорить с дочерним процессом, используя вызов subprocess.popen() python. В моем реальном коде я реализую тип IPC, поэтому я хочу написать некоторые данные, прочитать ответ, написать еще несколько данных, прочитать ответ и так далее. Из-за этого я не могу использовать Popen.communicate(), который в противном случае хорошо работает для простого случая.Чтение/запись в подпроцесс Popen()
Этот код показывает мою проблему. Он даже не получает первого ответа, зависает при первом «результате чтения». Зачем? Как я могу сделать эту работу, как я ожидаю? Выход
import subprocess
p = subprocess.Popen(["sed", 's/a/x/g'],
stdout = subprocess.PIPE,
stdin = subprocess.PIPE)
p.stdin.write("abc\n")
print "Reading result:"
print p.stdout.readline()
p.stdin.write("cat\n")
print "Reading result:"
print p.stdout.readline()
Действительно, он работает! Мой sed почему-то использует -u для «небуферизованного», а не -l, но он работает все равно. Это решает мой примерный код, но, к сожалению, не мой настоящий код, так как фактическая команда не sed, а другая программа python. Хороший ответ, хотя, вы точно определили проблему. –
Yup, проблема решена. Проблема заключалась в выводе буферизации результата. Выполнение простой stdout.flush() в моем подпроцессе решило проблему. Благодаря! –