在 python 中使用 popen 和子进程打印 stdout 和 stderr

Print stdout and stderr with popen and subprocess in python

我在 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?

看到 docs, communicate() returns 您正在寻找的内容,当它被调用时。当您将 inp() 方法中的第二行替换为

时,您会得到它
    stdout_value, stderr_value = self.proc.communicate(f.read())

注意:如果您希望返回大量数据,communicate() 不是您的最佳选择:数据缓冲在内存中,因此您可能 运行 在那里遇到麻烦。相反,您最好将输入直接指向 self.proc.stdin,然后以可管理的块处理 self.proc.stdout

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

.communicate() returns 如果相应的 stdout 和 stderr 参数为 PIPEs.

,则 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()