Python的与子“1>&2”和stderr = STDOUT
我从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
方法打印出来的数据为标准错误重定向到标准输出,使其打印出错误信息到标准错误。
的1 >&2
壳码只适用于(回波)它出现在命令。这是如何告诉shell将该echo的输出指向shell的stderr流。
python代码stderr=subprocess.STDOUT
告诉子进程模块,您希望进程的stderr流与其stdout流相同的文件描述符,以便您可以读取任何进程写入的流或者将流交错在一起的流。
在外壳命令的exit 1
意味着该外壳退出并显示错误(非零)的状态。
代码的目的是要证明,蟒蛇功能subprocess.check_output
将检查退出状态,并抛出一个异常时,它是非零。
如果退出代码为非零,则会引发CalledProcessError。 CalledProcessError对象将在returncode属性中具有返回码,并在输出属性中输出。
你的描述:
运行代码,打印命令不执行
是有点误导,因为你忘了提及确实发生了输出:
Traceback (most recent call last):
File "t.py", line 6, in <module>
stderr=subprocess.STDOUT,
File "/usr/lib/python2.7/subprocess.py", line 573, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'echo to stdout; echo to stderr 1>&2; exit 1' returned non-zero exit status 1
即使我删除了所有三个打印命令,我也得到了相同的输出,所以我非常肯定打印命令是* n ot *执行。 – prosseek
@prosseek:是的,如果发生异常,除非你抓住它;不执行'print'语句,这是异常如何工作的 - 它们中断正常的程序流。你可以添加'try:check_output(...),除了CalledProcessError为e:print('例外:%s,捕获的输出:%s'%(e,e.output))' – jfs