如何将张量流导入错误从`stderr`重定向到`stdout`

问题描述 投票:0回答:1

问题

导入 Tensorflow 时,它会打印到

stderr
- bug 报告

目前,这使我的监控系统感到困惑,并将这些信息性消息记录为错误。

我想将这些消息从

stderr
重定向到
stdout

理论上,这应该可行:

def redirect_tensorflow_logs():
    print("Before - Outside redirect block", file=sys.stderr)
    with redirect_stderr(sys.stdout):
        print("Before -  Inside redirect block", file=sys.stderr)
        import tensorflow as tf
        print("After - Inside redirect block", file=sys.stderr)
    print("After - Outside redirect block", file=sys.stderr)

不幸的是,事实并非如此。这是我得到的输出:

输出 - 标准错误:

Before - Outside redirect block
2024-01-10 14:34:44.164579: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
After - Outside redirect block

输出 - 标准输出:

Before -  Inside redirect block
After - Inside redirect block

有没有办法将这些消息从

stderr
重定向到
stdout

替代解决方案

我知道设置

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
(https://stackoverflow.com/a/42121886/251589) 可以完全删除这些消息。我宁愿不这样做,因为在某些时候,我会想要解决这些问题,而隐藏它们将使未来的开发人员更难理解正在发生的事情。

我还可以通过如下方式将程序的所有输出从 stderr 重定向到 stdout:

python -m myprogram 2>&1
。这将阻止我的监控系统引发错误,但可能会导致我将来错过一些真正的错误

python tensorflow logging stderr
1个回答
0
投票

我找到的最佳解决方案是将 stderr 映射到 stdout。这有点棘手,因为您需要从 TensorFlow 启动的底层 C 进程中捕获 stderr。

这有效:


# NOTE this must be run prior to any other import tensorflow

from contextlib import redirect_stderr
from wurlitzer import sys_pipes
with redirect_stderr(sys.stdout):
    with sys_pipes():
        import tensorflow
© www.soinside.com 2019 - 2024. All rights reserved.