我正在使用一个对对象执行某些操作的 Python 库
do_something(my_object)
并改变它。这样做时,它会将一些统计信息打印到标准输出,我想掌握这些信息。正确的解决方案是改变do_something()
返回相关信息,
out = do_something(my_object)
但开发者还需要一段时间do_something()
开始讨论这个问题。作为一种解决方法,我考虑解析任何内容do_something()
写入标准输出。
如何捕获代码中两点之间的标准输出输出,例如,
start_capturing()
do_something(my_object)
out = end_capturing()
?
试试这个上下文管理器:
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
Usage:
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)
Output:
displays on screen
done
output: ['hello world', 'hello world2']
Update: 他们补充说redirect_stdout()
to contextlib https://docs.python.org/3/library/contextlib.html#contextlib.redirect_stdout在 Python 3.4 中(以及redirect_stderr()
)。所以你可以使用io.StringIO
以此来达到类似的结果(尽管Capturing
作为列表和上下文管理器可以说更方便)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)