【问题标题】:communicate() does not catch suprocess stdout通信()不捕获子进程标准输出
【发布时间】:2013-09-19 17:20:28
【问题描述】:
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 实时读取标准输出?如果它是一个大的标准输出,它不能读取它?谁能解释一下?

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

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

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

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

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

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

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

    【讨论】:

    • 我想在控制台中实时打印错误信息。所以,如果我添加 stderr = subprocess.PIPE。它不打印信息。如何实时打印错误信息?
    • subprocess.communicate() 返回输出和错误消息。如果您无法打印错误消息,则可能没有错误。为了回答关于缓冲区大小的其他问题,通信应该能够刷新缓冲区中的信息,并且它不应该导致任何死锁。更多信息请查看this
    • 谢谢,我添加了一些代码来显示 cmd 如何在后台运行,它使用一个循环并且每个循环都打印 stderr,但是,如果我使用 ubprocess.Popen(cmd, shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 它不会在每个循环中打印结果当cmd 运行时循环。
    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2023-03-12
    • 2012-09-17
    • 2010-12-09
    • 2013-01-22
    相关资源
    最近更新 更多