У меня есть длинная серверная программа (скажем, программа A), которая написана в QT/C++. программа не настолько стабильна, поэтому я решил написать скрипт python для ее перезапуска, если он сработает. проблема в том, что программа может начать сбой (если я дал ей порт для использования), распечатайте ошибку, а затем просто повесьте ее, не выходя из нее, поэтому я должен следить за выпуском программы и убивать ее при неудачном запуске.оконная консольная программа stdout буферизуется при использовании перенаправления на трубе
это часть моего окончательного кода (ну, на самом деле это нормально, вы можете просто игнорировать его):
self.subp = subprocess.Popen(
r'.\A.exe -server %d' % portnum,
stdout=subprocess.PIPE, bufsize=1)
for line in iter(self.subp.stdout.readline, ''):
print(line, end='')
, но я нашел, что я ничего не могу с стандартным выводом подпроцесса читать, то Readline метод просто блокирует там, и если я убью процесс A, скрипт python просто выйдет без какого-либо вывода. в начале я думал, что это проблема модуля подпроцесса, но после некоторого теста я обнаружил, что это не так. если я заменяю командную строку A.exe какой-либо другой консольной программой Windows, например ping -t, все работает правильно. так что я думал, что это проблема программы.
К счастью, у меня есть исходный код, здесь кусок дела с выводом:
printf("Server is starting on port %u\n", Config.ServerPort);
if(server->listen())
printf("Starting successfully\n");
else
printf("Starting failed!\n");
после некоторого поиска я добавить fflush(stdout);
к концу этого фрагмента кода, восстановить программу, и теперь он работает
поэтому моя проблема в том, что я все еще не могу понять, что не так с исходным программным кодом? без принудительной очистки, он может правильно напечатать эти строки в консоли Windows сразу после запуска программы. почему выход буферизуется при использовании трубы на выходе? я читал, что в стандартном c-исполнении вывод будет автоматически очищен от новой строки, но почему бы и нет в моей ситуации? это проблема с Windows или проблема с компилятором?
Программа, скомпилированная с QT/C++, QT версия 4.7.4 (x32), компилятор C++ - это ming32 g ++, поставляемый с QT (GCC 4.4.0), все тесты проводились на платформе win7x64 и моя версия python - 2.7.2
Я думаю, что [связанная ссылка] (http://stackoverflow.com/q/20503671/4279) в комментариях в вашей ссылке объясняет многое, спасибо – adamhj