communic()不捕获子进程标准输出

时间:2013-09-19 17:20:29

标签: python subprocess

import subprocess    
def ExecuteAndGetValue(cmd, v):
        PrintCmd(cmd, v)
        sub = subprocess.Popen(cmd, shell = True, stdout=subprocess.PIPE)  
        result = sub.communicate()
        sub.wait()
        return result

import subprocess    
def ExecuteAndGetValue2(cmd, v):
    PrintCmd(cmd, v)
    sub = subprocess.Popen(cmd, shell = True, stdout=subprocess.PIPE)  
    result = sub.communicate()[0]
    return result


[aa, err] = Util.ExecuteAndGetValue(cmd, args.v)  # run half an hour, the output size is about 15MB
[bb, err] = Util.ExecuteAndGetValue(cmd, args.v)  # run half an hour, the output size is about 15MB
print aa  // aa is empty
print bb // bb is empty

cmd打印/输出:使用print >> sys.stderr的stderr和使用print的stdout

result = []
for i in range(n):
    print >> sys.stderr, "T_index: " + str(T_index)
    bb = func(i)
    result.append(bb)
print '\n'.join(result)

cmd有一个循环,其中打印stderr信息。最后,它将所有输出打印到result

(1)如果cmd打印较小的字符串,则可以正常工作。 aabb显示正确的结果。

(2)如果cmd打印大尺寸(例如10 Mb),则aabb为空。

(3)基于上述测试,我认为sub.communicate()[0]实时读取了Popen的stdout?如果它是一个大型的stdout,它无法读取它?有人可以解释一下吗?

另外,我想在屏幕上实时看到stderr或错误信息。如果我使用以下内容,它不会实时显示stderr:

import subprocess    
def ExecuteAndGetValue(cmd, v):
        PrintCmd(cmd, v)
        sub = subprocess.Popen(cmd, shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)  
        result = sub.communicate()
        print result[1]
        return result

如何解决此问题?它可能与缓冲区大小有关?谢谢

1 个答案:

答案 0 :(得分:2)

您需要在Popen调用中使用stderr参数。

sub = subprocess.Popen(cmd, shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return sub.communicate()

您不需要使用sub.wait() - communic()等待命令执行完成并返回输出/错误消息。