【问题标题】:Filtering stderr of subprocess captures empty bytes过滤子进程的stderr捕获空字节
【发布时间】:2019-10-16 00:07:26
【问题描述】:

我正在调用一个非常嘈杂的 CLI 命令并想要过滤输出,大概是 stderr。 CLI 二进制文件的输出类似于 python 日志记录、INFO:… 或 WARNING:…。在 shell 中运行时,CLI 命令首先有一些“设置”日志,几秒钟后,每秒几十个的实际日志开始。

我尝试通过管道传输标准错误,并确保标准输出,如下所示:

process = subprocess.Popen(cmd, 
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE)

    while process.stderr:
        line = process.stderr.readline()
        print("STDERR", line)

    while process.stdout:
        line = process.stdout.readline()
        print("STDOUT", line)

这有效,并且 STDERR 打印出现在 CLI 命令执行的第一位。但是,当我在几秒钟后到达该部件时,我的 STDERR 打印输出仅为b'' — 可能与正常 shell 调用输出额外日志的频率相同。我也试过 read() 而不是 readline() 但无济于事。 (“STDOUT”永远不会被调用,顺便说一句)

以某种方式,在常规 shell 调用中记录的输出不同或过于频繁(?)或不完整(?) PIPE 无法发送它并正确读取和打印它。

我可以做些什么来进一步调试?

【问题讨论】:

    标签: python logging subprocess pipe command-line-interface


    【解决方案1】:

    一个选项是将这些 while 循环替换为:

    for line in iter(process.stderr.readline, b''):
        print("STDERR", line)
    

    这至少可以解决process.stderr 永远不会成为假的事实,即使没有可读取的内容。

    【讨论】:

    • 谢谢。我做了更多的挖掘工作,每当我将特定的 CLI 调用指向 PIPE python 时,它似乎就会冻结。之前的跟踪有效并且来自另一个 CLI 调用,但是这个特定的命令似乎输出了一些会破坏 PIPE 的东西。
    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 2022-01-18
    • 2013-03-01
    • 2018-08-05
    • 2020-07-22
    • 1970-01-01
    • 2012-10-04
    • 2017-11-24
    相关资源
    最近更新 更多