Вывод из подпроцесса недоступен для небуферизованного канала stdout до завершения подпроцесса? - PullRequest
0 голосов
/ 15 декабря 2018

Я создал подпроцесс, используя subprocess.Popen(['myapp'], stdin=PIPE, stdout=PIPE, stderr=PIPE, bufsize=0), который выполняет C-программу, которая записывает в stdout, используя, например, puts().

Проблема в том, что программа Python блокируется в p.stdout.read(1024),хотя подпроцесс начинается с puts("HelloWorld").Только после завершения подпроцесса вывод доступен на p.stdout.Я подумал, что bufsize=0 будет означать, что каналы станут небуферизованными, так что выходные данные будут немедленно доступны для канала.

Я прочитал приведенный ниже вопрос, в котором говорится, что переводы строки должны вызывать сброс данных.Тем не менее, puts() выводит новую строку, поэтому каналы не распознаются как интерактивное устройство?

Разница между put () и printf () в C при использовании sleep ()

Это потому, что put также выводит символ новой строки, который на устройствах, которые могут быть определены как интерактивные, вызывает сброс по умолчанию (для стандартного вывода) (a).

Есть идеи?

1 Ответ

0 голосов
/ 15 декабря 2018

Это приложение поведение.Даже если pipe не буферизован, приложения обычно буферизуют информацию, которую они собираются записать в файл (любой тип файла) в течение некоторого времени, прежде чем он будет фактически записан.Как указывается в приведенном выше комментарии Джона, программы могут использовать системный вызов, такой как fflush(), чтобы убедиться, что они действительно разместили данные и, если применимо, что физическая операция ввода / вывода фактически завершилась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...