2017-07-19 14 views
2

私はのファイルに私のJupyter Notebook内のいくつかのセルをstdoutにリダイレクトしようとしていましたが、残りのセルはthisでキャンセルします。最初のセルセットからの出力は、それが意図したようにファイルに書き込まれました。キャンセルコマンドsys.stdout = sys.__stdout__の後のセルの2番目のセットは出力を出さず、何もしないように見えましたが、後でノートブックが起動した端末に着陸していたことがわかりました。Jupyterノートブックからのstdoutリダイレクトが端末に着信しています

それはまったく同じのPythonでPythonインタプリタで完璧に動作します:

(miniconda3-latest) [email protected]:~/Documents/project1 $ python 
Python 3.6.0 |Continuum Analytics, Inc.| (default, Dec 23 2016, 12:22:00) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.stdout = open('stdout.txt', 'w') 
>>> print("a") 
>>> print("a") 
>>> print("a") 
>>> sys.stdout = sys.__stdout__ 
>>> print ("b") 
b 
>>> print ("b") 
b 
>>> print ("b") 
b 
>>> # lots of a's are in the file and no b's 

Jupyterのノートブックでも同様のアプローチは、端末でこれを与えている:

[W 22:05:34.192 NotebookApp] 404 GET /nbextensions/widgets/notebook/js/extension.js (127.0.0.1) 1.71ms referer=http://localhost:8889/notebooks/test_stdout.ipynb 
b 
b 
b 

どのようにこのコードをすることができそれをリセットした後、端末の代わりに通常は出力が流れるセルの下にbが表示されるように適応しましたか?

答えて

2

私はそれをテストすることはできませんが、私が見る唯一の説明はsys.stdoutないsys.__stdout__なく、再ルーティング/変更されたファイルオブジェクトのセルにデータを置くことができるようにするためであるということである(あなたのコメントがそれだことを示していますipykernel.iostream.OutStreamインスタンス)。

ので、代わりのsys.__stdout__にリセットするには、sys.stdoutの参照格納してください:このメソッドは、標準の端末で動作することを

import sys 
old_stdout = sys.stdout 
sys.stdout = open('stdout.txt', 'w') 
... 
sys.stdout = old_stdout 

注意を。

+0

ありがとうございます。ノートブックで 'old_stdout'のオブジェクトを見てみると、' ' – cardamom

+0

私はそれに気付かなかったことを認めなければなりません'sys .__ stdout__'も存在していました。私はいつも私の答え(すべての手で行わなければならないCのような言語に慣れなければならない)に記述された方法を使用した。あなたはバックアップしていないことに注意してください。あなたはそれを失うのではなく、_reference_を保存しています。 –

関連する問題