首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法将stderr重定向到Jupyter中的文件?

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

Stack Overflow用户
提问于 2015-12-08 08:29:55
回答 2查看 4.3K关注 0票数 3

在IPython.utils中有一个redirect_output函数,还有一个%%capture魔术函数,但现在这些都没有了,关于这个主题的this thread现在已经过时了。

我想做一些类似以下的事情:

代码语言:javascript
复制
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。然后,我想要获取输出,对其进行处理,并绘制数据。

EN

回答 2

Stack Overflow用户

发布于 2015-12-08 09:17:44

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

代码语言:javascript
复制
import sys
oldstderr = sys.stderr
sys.stderr = open('log.txt', 'w')
# do something
sys.stderr = oldstderr

更新:从Python3.4开始,你应该考虑改用contextlib.redirect_stdout(),如下所示:

代码语言:javascript
复制
f = io.StringIO()
with redirect_stdout(f):
    print('a')
s = f.getvalue()
票数 3
EN

Stack Overflow用户

发布于 2015-12-08 12:53:50

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

代码语言:javascript
复制
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的魔力,那就太好了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34145950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档