Python захватить стандартный вывод из подпроцесса построчно

Я прочитал много вопросов, связанных с этим, и многому научился, но до сих пор не смог решить свою проблему. Я создаю приложение wxPython, которое запускает исполняемый файл c ++ и отображает стандартный вывод этого исполняемого файла в режиме реального времени. Я столкнулся с несколькими странными результатами, пытаясь заставить эту работу. Вот мои текущие настройки / проблемы:

//test.cc (compiled as test.out with gcc 4.5.2)
#include <stdio.h>
int main()
{
  FILE* fh = fopen("output.txt", "w");
  for (int i = 0; i < 10000; i++)
  {
      printf("Outputting: %d\n", i);
      fprintf(fh, "Outputting: %d\n", i);
  }
  fclose(fh);
  return 0;
}

#wxPythonScript.py (running on 2.7 interpreter)
def run(self):
  self.externalBinary = subprocess.Popen(['./test.out'], shell=False, stdout=subprocess.PIPE)
  while not self.wantAbort:
      line = self.externalBinary.stdout.readline()
      wx.PostEvent(self.notifyWindow, Result_Event(line, Result_Event.EVT_STDOUT_ID))
    print('Subprocess still running')
  print('Subprocess aborted smoothly')

Если я запускаю приведенный выше код, подпроцесс занимает очень много времени, даже если вы просто запишите данные и выйдете. Однако, если я запускаю следующее, оно завершается очень быстро:

#wxPythonScript.py (running on 2.7 interpreter)
def run(self):
  outFile = open('output.txt', 'r+')
  self.externalBinary = subprocess.Popen(['./test.out'], shell=False, stdout=outFile)
  while not self.wantAbort:
      #line = self.externalBinary.stdout.readline()
      #wx.PostEvent(self.notifyWindow, Result_Event(line, Result_Event.EVT_STDOUT_ID))
    print('Subprocess still running')
  print('Subprocess aborted smoothly')

Так что в основном всякий раз, когда я перенаправляю стандартный вывод из подпроцесса в PIPE, он замедляется / зависает, но если я записываю его в файл или вообще не перенаправляю, тогда это нормально. Почему это?

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

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