首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >communicate()不捕获进程stdout

communicate()不捕获进程stdout
EN

Stack Overflow用户
提问于 2013-09-19 17:20:28
回答 1查看 388关注 0票数 0
代码语言:javascript
复制
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使用print >> sys.stderr,stdout使用print

代码语言:javascript
复制
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()实时读取Popen的标准输出?如果它是一个很大的标题栏,它就不能读吗?有人能再解释一下吗?

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

代码语言:javascript
复制
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

我怎样才能解决这个问题?它可能与缓冲区大小有关吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-19 17:31:27

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

代码语言:javascript
复制
sub = subprocess.Popen(cmd, shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return sub.communicate()

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18901156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档