Ответы Тило и sepp2k верны: если вы закроете stdin
, ваш простой тест закончится.Проблема решена.
Хотя в своем комментарии к ответу sepp2k вы указываете, что у вас все еще возникают зависания.Ну, есть некоторые ловушки, которые вы могли не заметить.
Застрял в полном буфере для stderr
Если вы вызываете программу, которая печатает в stderr больше, чем может вместить буфер анонимного канала (64 КБ для текущих Linux), программа приостанавливается.Приостановленная программа не выходит и не закрывает стандартный вывод.Следовательно, чтение из его стандартного вывода будет зависать.Поэтому, если вы хотите сделать это правильно, вы должны использовать потоки или IO.select
, неблокирующее, небуферизованное чтение, чтобы читать как из stdout, так и из stderr параллельно или по очереди, не застревая.
Застрялна полном буфере для stdin
Если вы попытаетесь передать в вашу программу больше (намного больше), чем "foobar" (cat
), буфер анонимного канала для stdout заполнится.ОС приостановит cat
.Если вы напишете еще больше в stdin, буфер анонимного канала для stdin заполнится.Тогда ваш звонок на stdin.write
застрянет.Это означает: вам нужно писать в stdin, читать из stdout и читать из stderr параллельно или по очереди.
Заключение
Прочитайте хорошую книгу (Ричардс Стивенс, «Сетевое программирование в UNIX: межпроцессное взаимодействие») и используйте хорошие библиотечные функции.IPC (межпроцессное взаимодействие) слишком сложен и подвержен неопределенному поведению во время выполнения.Слишком много хлопот, чтобы попытаться сделать это правильно методом проб и ошибок.
Использование Open3.capture3
.