从subprocess.Popenasynchronous读取标准输出

我正在使用subprocess.popen运行一个子程序。 当我从命令窗口(cmd.exe)启动我的Python程序时,随着程序的发展,程序会在窗口中写入一些信息和date。

当我不在命令窗口中运行我的Python代码时,它会为此子程序的输出打开一个新的命令窗口,我想避免这种情况。 当我使用下面的代码时,它不显示cmd窗口,但它也不打印状态:

p = subprocess.Popen("c:/flow/flow.exe", shell=True, stdout=subprocess.PIPE) print p.stdout.read() 

如何在程序输出中显示子程序的输出?

用这个:

 cmd = subprocess.Popen(["c:/flow/flow.exe"], stdout=subprocess.PIPE) for line in cmd.stdout: print line.rstrip("\n") cmd.wait() # you may already be handling this in your current code 

请注意,您仍然需要等待子程序刷新其stdout缓冲区(在不写入终端窗口时缓冲区通常会有所不同),因此您可能无法在子程序打印时立即看到每一行(此取决于子程序的各种操作系统细节和细节)。

另外请注意我是如何去除shell = True的,并用列表替换了字符串参数,通常建议使用这个列表。

寻找一个配方来异步处理Popen数据我偶然发现http://code.activestate.com/recipes/576759-subprocess-with-async-io-pipes-class/

这看起来相当有前途,但是我有一个印象,可能会有一些错别字。 还没有尝试过。

这是一个老帖子,但是一个很难找到解决方案的常见问题。 试试这个: http : //code.activestate.com/recipes/440554-module-to-allow-asynchronousous-subprocess-use-on-win/