抑制来自 C/C++ 库的标准输出消息

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

我正在尝试抑制由 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 与日志记录混为一谈。

在所有情况下,都会打印该消息。我该如何让它停止?

python cpython
1个回答
0
投票

假设有一个类似 UNIX 的平台,(如果不是,您将得到一个

OSError

您可以使用

保存底层fd
backup = os.dup(sys.stdout.fileno())

使用

将其指向不同的文件(例如
devnull

os.dup2(devnull.fileno(), sys.stdout.fileno())

并恢复正常服务

os.dup2(backup, sys.stdout.fileno())
© www.soinside.com 2019 - 2024. All rights reserved.