0
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打印/输出:stderr usingprint >> sys.stderr和 stdout usingprint

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,aa并且bb是空的。

(3) 基于上述测试,在我看来 sub.communicate()[0] 从 Popen 实时读取标准输出?如果它是一个大的标准输出,它不能读取它?有人可以再解释一下吗?

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

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

我该如何解决这个问题?它可能与缓冲区大小有关?谢谢

4

1 回答 1

2

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

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

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

于 2013-09-19T17:31:27.053 回答