2012-01-27 5 views
5

У меня есть длинная серверная программа (скажем, программа 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

ответ

1

Я столкнулся с тем же вопросом, что и ваш. (How fo force subprocess to refresh stdout buffer?)

стандартный вывод трубы перенаправлять на окнах полностью буферный defaultly, это означает, что вы не можете прочитать что-нибудь из трубы, если подпроцесс перспектива не до конца или вызвать fflush после Printf на подпроцессе.

Это не проблема с окнами, а по дизайну, и иногда это проблема.

И я havnt нашел хорошее решение для этого вопроса, скажите мне, разрешите ли вы его решить.

+0

Я думаю, что [связанная ссылка] (http://stackoverflow.com/q/20503671/4279) в комментариях в вашей ссылке объясняет многое, спасибо – adamhj