2012-01-27 64 views
5

我有一個長期運行的服務器程序(比如程序A),它是用QT/C++編寫的。該程序不是很穩定,所以我決定寫一個python腳本來重新啓動它,如果它崩潰。問題是程序可能開始失敗(如果我給它一個正在使用的端口),打印錯誤,然後掛在那裏而不退出,所以我必須監視程序的stdout並在失敗的啓動時殺死它。Windows控制檯程序標準輸出使用管道重定向時被緩衝

這是一段我的最終代碼(好吧,其實這是好的,你可以忽略它):

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='') 

但我發現我無法讀取子的stdout什麼,readline的方法只是阻止那裏,如果我殺了一個進程,python腳本只是退出沒有任何輸出。在一開始,我認爲這是一個子進程模塊的問題,但經過一些測試後,我發現它不是。如果我用一些其他的Windows控制檯程序替換A.exe命令行,例如ping -t,一切工作正常。所以我認爲這可能是A程序的問題。

幸運的是,我有一個源代碼,這裏有一塊處理輸出:

printf("Server is starting on port %u\n", Config.ServerPort); 

if(server->listen()) 
    printf("Starting successfully\n"); 
else 
    printf("Starting failed!\n"); 

一些搜索我添加fflush(stdout);這一段代碼結束後,重建方案,現在它的工作

所以我的問題是,我仍然不明白,原來的A程序代碼有什麼問題?不用強制刷新,它可以在程序啓動後立即在Windows控制檯中正確打印這些字符串。爲什麼在使用管道輸出時輸出被緩衝?我在標準的c實現中讀取,輸出將自動刷新到新行,但爲什麼不在我的情況?這是一個Windows問題,或編譯器問題? A程序使用QT/C++進行編譯,QT版本爲4.7.4(x32),C++編譯器爲使用QT(GCC 4.4.0)的ming32 g ++,所有測試均在win7x64平臺上完成,並且我的Python版本是2.7.2

回答

1

我遇到了和你一樣的問題。重定向窗口管 (How fo force subprocess to refresh stdout buffer?

標準輸出完全defaultly緩衝,這意味着你不能讀取任何管除非子運行結束或子後的printf調用fflush。

這不是Windows的問題,但通過設計,它有時像一個問題。

我很高興爲這個問題找到了一個很好的解決方案,告訴我你是否解決了這個問題。

+0

我認爲[相關鏈接](http://stackoverflow.com/q/20503671/4279)在您的鏈接評論解釋得很多,謝謝 – adamhj 2014-09-09 02:03:43

相關問題