我在这里搜索了很多并且也用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中看到它吗?
此致
答案 0 :(得分:1)
要查看第二个命令的stderr
/ stdout
中第一个命令的stderr
:
stderr1
,例如,来自其stdin2
#!/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用于任何一个输出,因为您没有将它连接到另一个程序。