将 IPython 打印输出保存到文件中



我想访问并保存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)

最新更新