有没有办法将stderr重定向到Jupyter中的文件?

时间:2015-12-08 00:29:55

标签: python jupyter jupyter-notebook

在IPython.utils中有一个redirect_output函数,并且有一个%%捕获魔术函数,但现在这些函数已经消失了,关于这个主题的this thread现在已经过时了。

我想做以下事情:

from IPython.utils import io
from __future__ import print_function
with io.redirect_output(stdout=False, stderr="stderr_test.txt"):
    while True:
        print('hello!', file=sys.stderr)

思考?对于更多上下文,我试图捕获运行数小时或数天的某些ML函数的输出,并每隔5-10秒向stderr输出一行。然后我想获取输出,munge它,并绘制数据。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用其他文件描述符替换sys.stderr,方法与建议的here相同。

import sys
oldstderr = sys.stderr
sys.stderr = open('log.txt', 'w')
# do something
sys.stderr = oldstderr

答案 1 :(得分:1)

@Ben,只是替换sys.stderr不起作用,完全刷新逻辑suggested in the post是必要的。但是感谢你指针,因为它最终给了我一个工作版本:

import sys
oldstderr = sys.stderr
sys.stderr = open('log.txt', 'w')
class flushfile():
    def __init__(self, f):
        self.f = f
    def __getattr__(self,name): 
        return object.__getattribute__(self.f, name)
    def write(self, x):
        self.f.write(x)
        self.f.flush()
    def flush(self):
        self.f.flush()
sys.sterr = flushfile(sys.stderr)
from __future__ import print_function
# some long running function here, e.g. 
for i in range(1000000):
    print('hello!', file=sys.stderr)
sys.stderr = oldstderr

如果Jupyter保留redirect_output()函数和/或%%capture魔法,那就太好了。