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() 参考 Cの共有ライブラリがPythonの標準出力に印刷されないようにするにはどうすればいいですか? - コードログ ctypes - How do I prevent a C shared library to print on stdout in python? - Stack Overflow 標準出力を黙らせるデコレーター - Qiita Pythonのデコレータについて - Qiita Capturing print output from shared library called from python with ctypes module - Stack Overflow