我想访问并保存IPython单元格的文本输出,例如打印命令生成的输出。请注意,这与 _ 不同。
例如,如果执行此单元格:
def printer():
print 'boom'
print 'zoom'
printer()
输出为:
zoom
boom
_
返回一个空字符串。我想以某种方式访问放入屏幕(Out
单元格)的缓冲区。谢谢
对于通用的 Python 解决方案,您可以将sys.stdout
重定向到将输出传递给真实内容的内容,但还可以跟踪您打印的内容。
这样做的最大问题是,无法判断哪些stdout.write
来自给定的print
语句。print
可以多次呼叫write
。一种选择是只记住最后一行。
这是一个快速而肮脏的黑客(在真正的程序中,您希望将其他所有内容转发到真正的stdout
):
#!/usr/bin/env python
import sys
class CachingStdOut(object):
def __init__(self, stdout):
self.stdout = stdout
self.last = ''
def write(self, stuff):
self.last = (self.last + stuff).splitlines()[-1]
return self.stdout.write(stuff)
sys.stdout = CachingStdOut(sys.stdout)
def printer():
print 'boom'
print 'zoom'
zoom = sys.stdout.last # the last line printed was 'zoomn'
printer()
print zoom
Python 3 通过拥有一个 print
函数,你可以用自己的函数隐藏,而不是你不能隐藏的print
语句,使这变得更容易。如果你愿意切换到 Python 3 风格,同时仍然停留在 2.7 中,你可以from __future__ import print_function
.当然,你必须决定"最后打印的东西"是什么意思,当它很可能是一堆单独的参数和关键字参数时,但无论你决定什么,你都可以轻松做到:
#!/usr/bin/env python
from __future__ import print_function
import sys
_print = print
def print(*args, **kwargs):
global last_print
last_print = args, kwargs
_print(*args, **kwargs)
def printer():
print('boom')
print('zoom')
zoom, _ = last_print # zoom now holds ('zoom'), and _ holds {}
printer()
print(*zoom)