3

IPython.utils には redirect_output 関数があり、%%capture マジック関数がありましたが、これらはなくなりました。トピックに関するこのスレッドは古くなっています。

次のようなことをしたいと思います。

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 秒ごとに 1 行を stderr に出力しようとしています。次に、出力を取り、それを変更して、データをプロットします。

4

2 に答える 2

3

here でsys.stderr提案されているのと同じ方法で、おそらく他のファイル記述子に置き換えてみることができます。

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

更新: Python 3.4 以降では、contextlib.redirect_stdout()代わりに次のように使用することを検討する必要があります。

f = io.StringIO()
with redirect_stdout(f):
    print('a')
s = f.getvalue()
于 2015-12-08T01:17:43.717 に答える
1

@Ben、置き換えるだけではsys.stderr機能せず、投稿で提案されている完全なフラッシュ ロジックが必要でした。しかし、最終的に動作するバージョンが得られたので、ポインタをありがとう:

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

redirect_output()Jupyter が関数や魔法を保持していればよかったのに%%capture

于 2015-12-08T04:53:49.623 に答える