从subprocess.Popen异步读取stdout

时间:2009-11-30 20:34:27

标签: python windows subprocess

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

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

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

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

3 个答案:

答案 0 :(得分:7)

使用此:

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缓冲区(在不写入终端窗口时通常以不同方式缓冲),因此当子程序打印时,您可能无法立即看到每一行它(这取决于各种OS细节和子程序的细节)。

还要注意我是如何删除shell = True并用列表替换字符串参数,这通常是推荐的。

答案 1 :(得分:1)

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

这看起来很有希望,但我觉得可能会有一些拼写错误。尚未尝试过。

答案 2 :(得分:0)

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