Python标准与管道
我在这里搜索了很多,还用谷歌搜索了一下,试图找出为什么我的第一个命令中的stderr没有出现在最终的stderr中。我知道其他方法,如“check_output”(python3)和“commands”(python2),但我想编写自己的跨平台方法。问题是: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
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')