aoirint's note

メモ帳

Python ログ出力抑制 デコレータ

出力を抑制するデコレータ。

Python 3.7.4、ctypesを使ったライブラリ呼び出しで動作を確認(darknet.py)。

# 標準出力・標準エラー出力の抑制
def silent(verbose=False):
    def _silent(func):
        def wrapper(*args, **kwargs):
            if not verbose:
                devnull = open(os.devnull, 'w')
                stdout = os.dup(1)
                stderr = os.dup(2)
                os.dup2(devnull.fileno(), 1)
                os.dup2(devnull.fileno(), 2)

            res = func(*args, **kwargs)

            if not verbose:
                os.dup2(stdout, 1)
                os.dup2(stderr, 2)
                devnull.close()

            return res

        return wrapper
    return _silent

使い方のイメージ(デコレータなせいで長くなってしまう、デコレータじゃなくて単純にコールバック風に関数を呼び出すラップ関数作ってもいいかも...)。

def func(verbose=False):
    @silent(verbose=verbose)
    def _func():
        cfunc()
    
    funcA()
    _func()
    funcB()

参考