2015-09-25 83 views
1

我从https://pymotw.com/2/subprocess/Python的与子“1>&2”和stderr = STDOUT

这个代码我不知道如何解释的代码,在check_output1>&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方法打印出来的数据为标准错误重定向到标准输出,使其打印出错误信息到标准错误。

enter image description here

回答

2

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 
+0

即使我删除了所有三个打印命令,我也得到了相同的输出,所以我非常肯定打印命令是* n ot *执行。 – prosseek

+2

@prosseek:是的,如果发生异常,除非你抓住它;不执行'print'语句,这是异常如何工作的 - 它们中断正常的程序流。你可以添加'try:check_output(...),除了CalledProcessError为e:print('例外:%s,捕获的输出:%s'%(e,e.output))' – jfs