2015-09-12 49 views
19

私はJupyter Notebookを使用して、時間がかかる一連の実験を実行します。 特定のセルが実行に時間がかかりすぎるので、ブラウザのタブを閉じて後で戻ってくるのが普通です。しかし、私はカーネル割り込みを実行します。ブラウザタブを閉じた後にJupyterノートブックを実行し続ける

私はこれを回避する方法があると思いますが、私はそれが

答えて

6

TL見つけることができません; DR:タブを閉じるに

コードは停止しませんが、出力はもはや電流を見つけることができますブラウザのセッションに表示されていたデータが失われ、タブが閉じられたときに実行中のコードが終了するまで、受け取ったすべての新しい出力が破棄されます。

ロングバージョン:

残念ながら、これが実装されていない(11月24日)。回避策がある場合、私はそれを見つけることもできません。 (まだ見て、ニュースで更新されます。)There is a workaround that saves output then reprints it、コードがまだそのノートブックで実行されている場合は動作しません。代わりに、あなたが出力を得ることができる2番目のノートブックを持っているだろう。

私はまた、同じ理由で、この機能が必要です。カーネルは、タブクローズ時にシャットダウンや中断をしません。また、タブを閉じるとコードが実行されなくなります。与えられた警告は正確に正しいです。「カーネルがビジー状態です。出力が失われる可能性があります。 100秒が終了するまで

、その後、タブを閉じる、ワンボックスで

import time 
a = 0 
while a < 100: 
    a+=1 
    print(a) 
    time.sleep(1) 

を実行し、再びそれを開いて、その後、別のボックスから

print(a) 

を実行すると、それがハングアップしますコードが完了すると、100が出力されます。

戻るときに、Pythonプロセスは、前回の保存が完了したときと同じ状態になります。これは意図された動作であり、ドキュメントではもっと明確にすべきです。実行コードからの出力は実際にはブラウザを再オープンするとブラウザに送信されます(これを説明する参照を失ってしまいます)。this commentのようなハックはそれらを受け取り、ちょうどそれらをいくつかのセルに投げるように動作します。

出力は、エンドポイント接続を介してアクセス可能な方法でのみ保存されます。 They've been working on this for a while (before Jupyter)、私はJupyterリポジトリ(this one references it, but is not it)の現在のバグを見つけることができません。

唯一の一般的な回避策は、いつでも離れることができ、実行中のページに残しておき、リモートセーブするか、別の場所にアクセスできるようにする自動保存に依存するコンピュータを見つけることです。これはそれを行うには悪い方法ですが、残念ながら、今のところ私がしなければならない方法です。

関連質問:

+0

タブが閉じているときにコードが実際に中断されていないと思います。しかし、出力は、あなたが言ったようにです。 私が使用している洗練された回避策は、結果を簡単に再作成できるように計算結果を保存することです。 特に私は、私の分類から混乱行列とROC曲線を保存し、それらを再プロットするだけです。 – ijoseph

+1

あなたはそうです。私は最終的にこれを再テストするつもりだった。良いキャッチ。 JupyterとIPythonのバグリスト自体の詳細もあります。私はそれらを狩り、ポストを更新します。 – Poik

2

上で参照し、私は今、いくつかの時間のためにも、この問題に苦しんでいます。

私の回避策は、すべてのログをファイルに書き込むことで、ブラウザが終了したとき(実際には多くのログがブラウザを経由してもハングアップする)、ログファイルを開くことでカーネルのジョブプロセスを見ることができますJupyterを使用してログファイルを開くこともできます)。

#!/usr/bin/python 
import time 
import datetime 
import logging 

logger = logging.getLogger() 

def setup_file_logger(log_file): 
    hdlr = logging.FileHandler(log_file) 
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
    hdlr.setFormatter(formatter) 
    logger.addHandler(hdlr) 
    logger.setLevel(logging.INFO) 

def log(message): 
    #outputs to Jupyter console 
    print('{} {}'.format(datetime.datetime.now(), message)) 
    #outputs to file 
    logger.info(message) 

setup_file_logger('out.log') 

for i in range(10000): 
    log('Doing hard work here i=' + str(i)) 
    log('Taking a nap now...') 
    time.sleep(1000) 
11

これまで最も簡単な回避策がbuilt-in cell magic%%captureのようだ:

%%capture output 
# Time-consuming code here 

保存、タブを閉じるには、後で戻ってきます。出力は今output変数に格納されます。これは、すべての中間print結果と同様に、プレーンまたはリッチ出力セルを表示します

output.show() 

関連する問題