我正在尝试抑制由 C 实现的库打印到标准输出的消息。
我的具体用例是 OpenCV,因此我将在下面的 MCVE 中使用它。estimateChessboardSharpness
当网格尺寸太小时(这里发生这种情况),该函数会打印输出。我创建了一个PR 来修复它,但与此同时,我想隐藏该消息。例如:
import cv2
import numpy as np
img = np.zeros((512, 640), dtype='uint8')
corners = []
for i in range(10):
for j in range(8):
corner = (30 + 3 * j, 70 + 3 * i)
if i and j:
corners.append(corner)
if (i % 2) ^ (j % 2):
img[corner[0]:corner[0] + 3, corner[1]:corner[1] + 3] = 255
corners = np.array(corners)
>>> cv2.estimateChessboardSharpness(img, (9, 7), corners)
calcEdgeSharpness: checkerboard too small for calculation.
((9999.0, 9999.0, 9999.0, 9999.0), None)
该行看起来很简单std::cout << ...
,因此我尝试了以下所有操作:
from contextlib import redirect_stdout
from os imoprt devnull
import sys
with redirect_stdout(None):
cv2.estimateChessboardSharpness(img, (9, 7), corners)
with open(devnull, "w") as null, redirect_stdout(null):
cv2.estimateChessboardSharpness(img, (9, 7), corners)
sys.stdout = open(devnull, "w")
cv2.estimateChessboardSharpness(img, (9, 7), corners)
我甚至尝试过,redirect_stderr
而不是redirect_stdout
以防万一。我还尝试在导入之前OPENCV_LOG_LEVEL=SILENT
在 bash 和os.environ["OPENCV_LOG_LEVEL"] = "SILENT"
python 中进行设置cv2
,但我没想到在这种情况下 stdout 会与日志记录混淆。
在所有情况下,都会打印该消息。如何让它停止?
假设一个类 UNIX 平台,(
OSError
如果不是,你会得到一个)您可以使用以下方式保存底层 fd
将其指向不同的文件(例如
different
)并恢复正常服务
请注意,如果重定向到的文件也用于缓冲输出(即,您将写入与使用
different
C++ 库写入混合的文件写入...),则此操作将不会正常运行。std::cout
different.fileno()