导入 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
。这将阻止我的监控系统引发错误,但可能会导致我将来错过一些真正的错误。
我找到的最佳解决方案是将 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