У меня проблемы с перенаправлением stdio другой программы с помощью модуля подпроцесса. Простое чтение из stdout приводит к зависанию, и Popen.communicate () работает, но закрывает каналы после чтения / записи. Как проще всего это реализовать?
Я играл с этим в окнах:
import subprocess
proc = subprocess.Popen('python -c "while True: print \'Hi %s!\' % raw_input()"',
shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
while True:
proc.stdin.write('world\n')
proc_read = proc.stdout.readline()
if proc_read:
print proc_read





Не соответствует вашему примеру на 100%, но помогает понять основную проблему: процесс P запускает дочерний элемент C. Ребенок C записывает что-то в свой стандартный вывод. stdout C - это канал с буфером на 4096 символов, и вывод короче этого значения. Теперь C ждет ввода. Для C все нормально.
P ожидает вывода, который никогда не придет, потому что ОС не видит причин очищать выходной буфер C (с таким небольшим количеством данных в нем). Поскольку P никогда не получает вывод C, он никогда ничего не записывает в C, поэтому C зависает, ожидая ввода от P.
Исправление: используйте сброс после каждой записи в канал, заставляя ОС отправлять данные сейчас.
В вашем случае добавление proc.stdin.flush() в основной цикл while и sys.stdout.flush() в дочерний цикл после печати должно решить вашу проблему.
Вам также следует подумать о перемещении кода, который читает из другого процесса, в поток. Идея здесь в том, что вы никогда не узнаете, когда будут получены данные, и использование потока помогает вам понять эти проблемы, пока вы пишете код, обрабатывающий результаты.
Здесь я хотел показать вам новую документацию по Python 2.6, но она также не объясняет проблему с промывкой :( Ну что ж ...
Хорошее объяснение. Еще из документации pexpect: В: Почему бы просто не использовать канал (popen ())?
Документы Pexpect перемещены: вот новая ссылка
Дубликат: stackoverflow.com/questions/163542/…, stackoverflow.com/questions/295459/…