我从https://pymotw.com/2/subprocess/Python的与子“1>&2”和stderr = STDOUT
这个代码我不知道如何解释的代码,在check_output
与1>&2
输出重定向到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
运行代码,打印命令不执行没啥意思被捕获。
是什么代码试图完成?当我注释掉stderr=subprocess.STDOUT
线
*****************
Have 20 bytes in output
to stdout
to stderr
不过,我:
编辑
从答案和评论,我可以运行该代码来获得
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
这个输出有代替
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
方法打印出来的数据为标准错误重定向到标准输出,使其打印出错误信息到标准错误。
即使我删除了所有三个打印命令,我也得到了相同的输出,所以我非常肯定打印命令是* n ot *执行。 – prosseek
@prosseek:是的,如果发生异常,除非你抓住它;不执行'print'语句,这是异常如何工作的 - 它们中断正常的程序流。你可以添加'try:check_output(...),除了CalledProcessError为e:print('例外:%s,捕获的输出:%s'%(e,e.output))' – jfs