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 emptycmd打印/输出: stderr使用print >> sys.stderr,stdout使用print
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()实时读取Popen的标准输出?如果它是一个很大的标题栏,它就不能读吗?有人能再解释一下吗?
另外,我希望实时看到屏幕上的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我怎样才能解决这个问题?它可能与缓冲区大小有关吗?谢谢
发布于 2013-09-19 17:31:27
您需要在Popen调用中使用stderr参数。
sub = subprocess.Popen(cmd, shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return sub.communicate()您不需要使用sub.wait() - communicate()等待命令执行完成并返回输出/错误消息。
https://stackoverflow.com/questions/18901156
复制相似问题