在 python 中使用 popen 和子进程打印 stdout 和 stderr
Print stdout and stderr with popen and subprocess in python
我在 python 中有一个使用子进程和 comunicate()
的脚本,但我没有成功访问 stdout
和 stderr
。当我只使用 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 参数为 PIPE
s.
,则 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()
我在 python 中有一个使用子进程和 comunicate()
的脚本,但我没有成功访问 stdout
和 stderr
。当我只使用 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 参数为 PIPE
s.
除非需要,否则不要使用 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()