2009-11-30 90 views
6

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

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

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

我怎样才能显示子程序在我的程序的输出输出,因为它发生?

+2

为什么这个社区wiki? – 2009-11-30 20:36:29

+2

“窗口窗口”什么是Windows窗口?你在使用GUI框架吗?哪一个? – 2009-11-30 20:38:40

+0

好吧,我通过arcgis运行模型。当我点击我在那里创建的工具时,会出现一个窗口并显示进度。我想看到在我的命令窗口中出现的行。 – Mesut 2009-11-30 21:43:53

回答

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的,并将字符串参数替换为一个通常推荐的列表。

+0

或者'line.rstrip ..',您可以使用'line'(注意尾部逗号) – 2012-08-15 20:36:01

+2

['用于iter中的行(cmd.stdout.readline,“ “):print line,'](http://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line)可能会提供更直接的输出,可能会避免文件迭代器中的预读缓冲区(注意:子程序仍然需要刷新它的stdout) – jfs 2013-01-06 17:16:49

+1

看不出为什么这是异步。 – ManuelSchneid3r 2017-03-31 10:26:39

相关问题