このコンテキストマネージャーを試してください:
from io import StringIO
import sys
class Capturing(list):
def __enter__(self):
self._stdout = sys.stdout
sys.stdout = self._stringio = StringIO()
return self
def __exit__(self, *args):
self.extend(self._stringio.getvalue().splitlines())
del self._stringio # free up some memory
sys.stdout = self._stdout
使用法:
with Capturing() as output:
do_something(my_object)
output
これは、関数呼び出しによって出力される行を含むリストです。
高度な使用法:
明白ではないかもしれないことは、これを複数回実行でき、結果が連結されることです。
with Capturing() as output:
print('hello world')
print('displays on screen')
with Capturing(output) as output: # note the constructor argument
print('hello world2')
print('done')
print('output:', output)
出力:
displays on screen
done
output: ['hello world', 'hello world2']
更新:Python 3.4で追加さredirect_stdout()
れcontextlib
ました(とともにredirect_stderr()
)。したがって、これを使用io.StringIO
して同様の結果を得ることができます(ただしCapturing
、リストであり、コンテキストマネージャである方が間違いなく便利です)。