Python标准与管道

Python标准与管道,python,pipe,stderr,Python,Pipe,Stderr,我在这里搜索了很多,还用谷歌搜索了一下,试图找出为什么我的第一个命令中的stderr没有出现在最终的stderr中。我知道其他方法,如“check_output”(python3)和“commands”(python2),但我想编写自己的跨平台方法。问题是: import subprocess p1 = subprocess.Popen('dirr', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) p2 = subpro

我在这里搜索了很多,还用谷歌搜索了一下,试图找出为什么我的第一个命令中的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)
导入子流程
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.标准输出关闭()
输出,错误=p2.communicate()
打印(输出“”,错误)
我还尝试重定向stderr=subprocess.STDOUT,但这并没有改变情况。 您能告诉我如何从第一个命令重定向stderr,以便我可以在stdout或stderr中看到它吗


关于,

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

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

  • 第二个命令可以读取
    stderr1
    ,例如,从其
    stdin2
  • 第二个命令可以将此内容打印到其stdout2/stderr2
例子
#/usr/bin/env python
导入系统
从子流程导入Popen、PIPE、STDOUT
p1=Popen([sys.executable,'-c',“import sys;sys.stderr.write(“stderr1”)”),
标准偏差=标准偏差,标准偏差=管道)
p2=Popen([sys.executable,'-c',''import sys
打印(sys.stdin.read()+“stdout2”)
sys.stderr.write(“stderr2”)“”],
stdin=p1.stdout,stderr=PIPE,stdout=PIPE)
p1.标准输出关闭()
输出,错误=p2.communicate()
p1.等等
打印(输出“”,错误)
输出
('stderr1 stdout2\n','stderr2')

不正确<当您希望以编程方式读取Python中的流时(例如,通过此处使用的
communicate()
),也可以使用code>PIPE。
check\u output()
在Python 2.7中提供。我知道,我已将此纳入问题。我想基于这些命令编写自己的方法。我希望确保该命令在windows/linux上与python2/3配合使用,因为它将是我的库的一部分。到目前为止,这项工作已经完成,除了错误捕捉部分。非常感谢你,塞巴斯蒂安!这正是我需要的!不幸的是,我不能对你的精彩解释投票,因为像我这样的新手是不允许的。
#!/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')