在python中使用popen和subprocess打印stdout和stderr

时间:2015-05-09 19:23:43

标签: python subprocess

我在python中有一个使用子进程和comunicate()的脚本,但我没有成功访问stdoutstderr。当我只使用stdin脚本时效果很好。这是脚本的一部分:

proc = subprocess.Popen(["./a.out"],
                        shell=True,
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE,
                    )

def inp(self,txt):
    f=open(txt,"r")
    self.proc.communicate(f.read()) #this works well!!

    print self.proc.stdout.read #this doesn't work
    #or
    stdout_value=self.proc.communicate() 
    print stdout_value #this doesn't work
    #self.result.communicate()[1]

同样的问题在于stderr。如何阅读输出和stderr

2 个答案:

答案 0 :(得分:1)

请参阅docscommunicate()会在调用时返回您正在寻找的内容。当您通过

替换inp()方法中的第二行时,您会得到它
    stdout_value, stderr_value = self.proc.communicate(f.read())

注意:如果您希望返回大量数据communicate()不是您的最佳选择:数据会缓存在内存中,因此您可能会遇到麻烦。相反,您可以更好地将输入权转移到self.proc.stdin,然后以可管理的块处理self.proc.stdout

答案 1 :(得分:1)

.communicate()等待子进程完成。最多可以调用一次。

如果对应的stdout,stderr参数为.communicate(),则

PIPE将stdout和stderr作为字符串返回。

除非您需要,否则不要使用shell=True

您可以直接提供文件作为输入:

from subprocess import Popen, PIPE

with open(filename, 'rb', 0) as input_file:
    p = Popen(['./a.out'], stdin=input_file, stdout=PIPE, stderr=PIPE)
output, err = p.communicate()