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()

参考