我在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
?
答案 0 :(得分:1)
请参阅docs,communicate()
会在调用时返回您正在寻找的内容。当您通过
inp()
方法中的第二行时,您会得到它
stdout_value, stderr_value = self.proc.communicate(f.read())
注意:如果您希望返回大量数据communicate()
不是您的最佳选择:数据会缓存在内存中,因此您可能会遇到麻烦。相反,您可以更好地将输入权转移到self.proc.stdin
,然后以可管理的块处理self.proc.stdout
。
答案 1 :(得分:1)
.communicate()
等待子进程完成。最多可以调用一次。
.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()