1

我在这里搜索了很多并用谷歌搜索,试图找出为什么我的第一个命令中的 stderr 在最终的 stderr 中没有看到。我知道其他方法,例如“check_output”(python3)和“commands”(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,但这并没有改变事情。您能告诉我如何从第一个命令重定向标准错误,以便我可以在标准输出或标准错误中看到它吗?

问候,

4

2 回答 2

1

要查看第二个命令stderrstdout/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')
于 2012-06-20T18:38:47.963 回答
-1

对于 p2,您不应该将 subprocess.PIPE 用于任何一个输出,因为您没有将其通过管道传输到另一个程序。

于 2012-06-20T17:06:07.547 回答