Как вы сами узнали, .communicate()
справляется с этим.
Причина ваших наблюдений заключается в следующем:
- Два канала соединяют вашу программу и подпроцесс, а именно:stdin и его стандартный вывод.
- В зависимости от ОС каждый из этих каналов имеет размер буфера 65536 байт.
- Кроме того, в зависимости от программы и ее функций он читает 65536 байт какну и выводит некоторые данные.
Итак, если вы пишете 196608 байт, первые 65536 байт отправляются в stdin, читаются программой и (если это, например, cat
) выводятсяна стандартный вывод.Вторые 65536 байт помещаются в stdin, читаются программой и пытаются записать в stdout, но там он блокируется, так как stdout заполнен.Третьи 65536 байтов записываются в стандартный ввод.Для каждого лишнего байта пишите блоки, потому что stdin также полон.
Решение такое, как вы пишете: пусть .communicate()
обрабатывает все это.Он подготовлен для этой ситуации и обрабатывает его в зависимости от ОС с помощью потоков, опросов или вызовов select.