子进程的过滤stderr捕获空字节

时间:2019-05-30 10:31:21

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

我正在调用一个非常嘈杂的CLI命令,并且想要过滤输出(大概是stderr)。 CLI二进制文件的输出会像python日志记录,INFO:…或WARNING:…这样交换。在shell中运行时,CLI命令首先会包含一些“设置”日志,而在几秒钟后,每秒将启动几十个实际日志。

我已经尝试将stderr以及类似的stdout插入到这样的过程中:

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无法通过它发送并正确读取和打印它。

我该怎么做才能进一步调试呢?

1 个答案:

答案 0 :(得分:1)

一个选项是将以下while循环替换为:

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

这至少可以解决以下事实:process.stderr即使什么也没读,也永远不会变得虚假。