【发布时间】:2015-09-25 19:59:28
【问题描述】:
我有这个来自https://pymotw.com/2/subprocess/的代码
我不确定如何解释代码,在check_output 和1>&2 输出被重定向到stderr,但在参数中,stderr 回到stderr stderr=subprocess.STDOUT。
output = subprocess.check_output(
'echo to stdout; echo to stderr 1>&2; exit 1',
shell=True,
stderr=subprocess.STDOUT,
)
print "*****************"
print 'Have %d bytes in output' % len(output)
print output
运行代码,不执行打印命令意味着没有捕获任何内容。
这段代码试图完成什么?
编辑
从答案和评论中,我可以运行这段代码来获取
try:
output = subprocess.check_output(
'echo to stdout; echo to stderr 1>&2; exit 1',
shell=True, # No such file or directory error without, maybe 1>&2 requires shell=True
stderr=subprocess.STDOUT,
)
except subprocess.CalledProcessError as e:
print "*****************"
print 'Have %d bytes in output' % len(e.output)
print e.output
这个输出:
*****************
Have 20 bytes in output
to stdout
to stderr
但是,当我注释掉 stderr=subprocess.STDOUT 行时,我得到了替代
to stderr
*****************
Have 10 bytes in output
to stdout
EDIT2
我使用 stderr 库 (https://github.com/sickill/stderred) 进行了更多测试,该库有助于 shell 以红色显示来自 stderr 的字符。
当我执行此代码(注释掉重定向)时,我可以看到黑色的to stderr,这意味着它使用标准输出。
output = subprocess.check_output(
'echo to stdout; echo to stderr 1>&2; exit 1',
shell=True,
#stderr=subprocess.STDOUT,
)
据此,我猜(如果我错了,请纠正我)Python 的 check_output 方法将数据打印到 stderr 重定向到 stdout,以便将错误消息打印到 stderr。
【问题讨论】:
标签: python subprocess