Обход буферизации вывода подпроцесса с помощью popen в C или Python

У меня есть общий вопрос о popen (и всех связанных функциях), применимый ко всем операционным системам, когда я пишу скрипт на python или некоторый код на c и запускаю исполняемый файл из консоли (win или linux), я могу сразу увидеть вывод из процесса. Однако, если я запускаю тот же исполняемый файл, что и разветвленный процесс с его stdout, перенаправленным в канал, выходные буферы где-то, обычно до 4096 байтов, перед записью в канал, где родительский процесс может его прочитать.

Следующий скрипт Python сгенерирует выходные данные кусками по 1024 байта

import os, sys, time

if __name__ == "__main__":
     dye = '@'*1024
     for i in range (0,8):
        print dye
        time.sleep(1)

Следующий скрипт Python выполнит предыдущий скрипт и прочитает вывод, как только он попадет в канал, побайтно

import os, sys, subprocess, time, thread

if __name__ == "__main__":
    execArgs = ["c:\\python25\\python.exe", "C:\\Scripts\\PythonScratch\\byte_stream.py"]

    p = subprocess.Popen(execArgs, bufsize=0, stdout=subprocess.PIPE)
    while p.returncode == None:
        data = p.stdout.read(1)
        sys.stdout.write(data)
        p.poll()

Отрегулируйте путь для вашей операционной системы. При запуске в этой конфигурации выходные данные будут отображаться не порциями 1024, а порциями 4096, несмотря на то, что для размера буфера команды popen установлено значение 0 (в любом случае это значение по умолчанию). Может кто-нибудь сказать мне, как изменить это поведение ?, есть ли способ заставить операционную систему обрабатывать вывод от разветвленного процесса так же, как при запуске из консоли?, То есть просто передавать данные через без буферизации?

Ответы на вопрос(2)

Ваш ответ на вопрос