在IPython.utils中有一个redirect_output函数,还有一个%%capture魔术函数,但现在这些都没有了,关于这个主题的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。然后,我想要获取输出,对其进行处理,并绘制数据。
发布于 2015-12-08 09:17:44
您可以尝试使用其他文件描述符替换sys.stderr,方法与建议的here相同。
import sys
oldstderr = sys.stderr
sys.stderr = open('log.txt', 'w')
# do something
sys.stderr = oldstderr更新:从Python3.4开始,你应该考虑改用contextlib.redirect_stdout(),如下所示:
f = io.StringIO()
with redirect_stdout(f):
print('a')
s = f.getvalue()发布于 2015-12-08 12:53:50
@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的魔力,那就太好了。
https://stackoverflow.com/questions/34145950
复制相似问题