如何实时过滤错误消息

如何实时过滤错误消息

我目前在 Raspberry Pi 4 上使用 Python 中的 OpenCV,由于 libjpeg 的问题,我不断收到不必要的控制台消息,如下所示:

Corrupt JPEG data: 10 extraneous bytes before marker 0xd6

我的目标是过滤掉这些消息,同时仍然实时打印任何其他错误消息(当然还有正常的标准输出)。该程序是交互式的,因此我仍然必须能够在程序运行时向其提供输入。

我尝试使用Python从内部禁用打印到stderr和stdout(以防万一)答案,但似乎错误是由一个单独的进程(我假设是 libjpeg)引发的,因此从 Python 内重定向 sys.stderr 是无效的。我还尝试创建一个 bash one liner 来过滤掉以“Corrupt”开头的错误消息,最终得到以下结果:

python test.py 2> >(sed -u '/^Corrupt/ d')

这部分有效,因为它会过滤掉这些消息,但在脚本结束之前它也不会显示任何其他错误消息。因此,如果抛出错误,则在脚本完成后,该错误和所有其他错误消息都会同时显示,但只有那时。如果通过 CTRL-C 提前结束该过程,则根本不会显示错误。

关于如何过滤错误流而不缓冲所有其他错误消息直到最后有什么想法吗?

答案1

当直接打印到终端时,Python 默认会进行行缓冲,这样你就可以看到发生了什么。但是当将输出发送到管道/文件时,Python 将完全缓冲它。这是许多 Linux 命令的常见行为。要解决它,请使用python -u显式取消缓冲输出。

答案2

尝试:

python test.py 2>&1 | grep -v "Corrupt JPEG data"

相关内容