我正在尝试抑制由 C 实现的库打印到标准输出的消息。
我的具体用例是 OpenCV,所以我将其用于下面的 MCVE。当网格尺寸太小时,
estimateChessboardSharpness
函数会打印输出(这种情况发生在here)。我做了一个 PR 来修复它,但与此同时,我想隐藏该消息。例如:
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
>>> 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
)
您可以使用
保存底层fdbackup = os.dup(sys.stdout.fileno())
使用
将其指向不同的文件(例如
devnull
)
os.dup2(devnull.fileno(), sys.stdout.fileno())
并恢复正常服务
os.dup2(backup, sys.stdout.fileno())