【问题标题】:Python's subprocess with "1>&2" and stderr=STDOUT带有“1>& 2”和 stderr=STDOUT 的 Python 子进程
【发布时间】: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


    【解决方案1】:

    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 属性中具有返回码,并在输出属性中输出。

    您的描述:

    运行代码,打印命令没有执行

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

    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
    

    【讨论】:

    • 即使我删除了所有三个打印命令,我也得到了相同的输出,所以我很确定打印命令没有被执行。
    • @prosseek:是的,如果发生异常,那么除非你抓住它; print 语句不会执行,这就是异常的工作方式——它们会中断程序的正常流程。您可以添加try: check_output(...) except CalledProcessError as e: print('exception: %s, captured output: %s' % (e, e.output))
    猜你喜欢
    • 1970-01-01
    • 2011-07-07
    • 2023-04-06
    • 2021-06-02
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多