Python stderr和管道

时间:2012-06-20 17:02:15

标签: python pipe stderr

我在这里搜索了很多并且也用Google搜索,试图找出为什么在最后的stderr中没有看到我的第一个命令的stderr。我知道其他方法,如“check_output”(python3)和“命令”(python2),但我想编写自己的跨平台方法。这是问题所在:

import subprocess

p1 = subprocess.Popen('dirr', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
p2 = subprocess.Popen('find "j"', shell=True, stdin=p1.stdout, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
p1.stdout.close()
output,error=p2.communicate()
print(output,'<----->',error)

我也尝试重定向stderr = subprocess.STDOUT,但这没有改变。 你能告诉我如何从第一个命令重定向stderr,所以我可以在stdout或stderr中看到它吗?

此致

2 个答案:

答案 0 :(得分:1)

要查看第二个命令的stderr / stdout中第一个命令的stderr

  • 第二个命令可以读取stderr1,例如,来自其stdin2
  • 第二个命令可以将此内容打印到其stdout2 / stderr2

实施例

#!/usr/bin/env python
import sys
from subprocess import Popen, PIPE, STDOUT

p1 = Popen([sys.executable, '-c', """import sys; sys.stderr.write("stderr1")"""],
           stderr=STDOUT, stdout=PIPE)
p2 = Popen([sys.executable, '-c', """import sys
print(sys.stdin.read() + " stdout2")
sys.stderr.write("stderr2")"""],
           stdin=p1.stdout, stderr=PIPE, stdout=PIPE)
p1.stdout.close()
output, error = p2.communicate()
p1.wait()
print(output, '<----->', error)

输出

('stderr1 stdout2\n', '<----->', 'stderr2')

答案 1 :(得分:-1)

对于p2,您不应该将subprocess.PIPE用于任何一个输出,因为您没有将它连接到另一个程序。