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
打印较小的字符串,则可以正常工作。 aa
和bb
显示正确的结果。
(2)如果cmd
打印大尺寸(例如10 Mb),则aa
和bb
为空。
(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
如何解决此问题?它可能与缓冲区大小有关?谢谢
答案 0 :(得分:2)
您需要在Popen调用中使用stderr参数。
sub = subprocess.Popen(cmd, shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return sub.communicate()
您不需要使用sub.wait() - communic()等待命令执行完成并返回输出/错误消息。