异步读取subprocess.Popen的stdout

9 投票
3 回答
17491 浏览
提问于 2025-04-15 16:32

我正在用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

这是一篇旧帖子,但里面提到的问题很常见,而且解决起来比较难。你可以试试这个链接:http://code.activestate.com/recipes/440554-module-to-allow-asynchronous-subprocess-use-on-win/

2

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

这个方法看起来很不错,不过我觉得里面可能有一些拼写错误。我还没有尝试过。

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

请注意,你仍然需要等子程序把它的输出缓冲区清空(这个缓冲区在不写入终端窗口时通常会有不同的处理方式),所以你可能不会立刻看到子程序打印的每一行(这取决于不同操作系统的细节和子程序的具体情况)。

另外,注意我把shell=True去掉了,并且把字符串参数换成了列表,这样做通常是比较推荐的做法。

撰写回答