Не соответствует 100% вашему примеру, но помогает понять основную проблему: процесс P запускает дочерний C. Дочерний C записывает что-то в свой стандартный вывод. stdout of C - это канал, который имеет 4096-символьный буфер, и вывод у него короче. Теперь C ждет некоторого ввода. Для С все нормально.
P ожидает вывода, который никогда не будет получен, потому что ОС не видит причин для очистки буфера вывода C (с таким небольшим количеством данных в нем). Поскольку P никогда не получает выходные данные C, он никогда ничего не записывает в C, поэтому C зависает в ожидании ввода от P.
Исправлено: Используйте сброс после каждой записи в канал, заставляющий ОС отправлять данные сейчас .
В вашем случае добавление proc.stdin.flush()
в основной цикл while и sys.stdout.flush()
в дочерний цикл после печати должно исправить вашу проблему.
Вам также следует рассмотреть возможность перемещения кода, который читает другой процесс, в поток. Идея в том, что вы никогда не узнаете, когда поступят данные, и использование потока поможет вам понять эти проблемы, пока вы пишете код, который обрабатывает результаты.
В этом месте я хотел показать вам новую документацию по Python 2.6, но она также не объясняет проблему сброса :( О, хорошо ...