2012-01-27 61 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

相关问题