Python" 1>& 2"的子进程和stderr = STDOUT

时间:2015-09-25 19:59:28

标签: python subprocess

我有来自https://pymotw.com/2/subprocess/

的代码

我不确定如何解释代码,在1>&2中将stderr=subprocess.STDOUT输出重定向到stderr,但在参数中,stderr返回到stdout {{1} }。

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的字符。

当我执行此代码(注释掉重定向)时,我可以看到BLACK颜色中的to stderr,这意味着它使用了stdout。

output = subprocess.check_output(
        'echo to stdout; echo to stderr 1>&2; exit 1',
        shell=True,  
        #stderr=subprocess.STDOUT, 
        )

从这一点开始,我想(如果我错了,请纠正我)Python的check_output方法将数据打印到stderr重定向到stdout,以便将错误信息输出到标准错误,

enter image description here

1 个答案:

答案 0 :(得分:2)

1 >&2 shell代码仅适用于它出现的(echo)命令。它是如何告诉shell将该echo的输出定向到shell的stderr流。

python代码stderr=subprocess.STDOUT告诉子进程模块你希望进程的stderr流与它的stdout流是同一个文件描述符,这样你就可以读取进程写入的任何流交错在一起在一个流中。

shell命令中的exit 1表示shell以错误(非零)状态退出。

代码的目的是证明python函数subprocess.check_output将检查退出状态并在非零时引发异常。

  

如果退出代码非零,则会引发CalledProcessError。 CalledProcessError对象将在returncode属性中包含返回代码,并在output属性中输出。

您的描述:

  

运行代码,不执行打印命令

有点误导,因为你忽略了确实发生的输出:

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