web-dev-qa-db-ja.com

ブラウザタブを閉じた後もJupyterノートブックを実行し続ける

Jupyter Notebookを使用して、時間がかかる一連の実験を実行します。特定のセルは実行に時間がかかりすぎるため、ブラウザのタブを閉じて、後で戻ってくるのが普通です。しかし、カーネル割り込みを実行すると、実行が中断されます。

これには回避策があると思いますが、見つかりません

32
Fotis

これに対する最も簡単な回避策は、 ビルトインセルマジック%%capture

%%capture output
# Time-consuming code here

保存してタブを閉じ、後で戻ってください。出力はoutput変数に保存されます。

output.show()

これにより、すべての中間print結果とプレーンまたはリッチ出力セルが表示されます。

31
Seb

TL; DR:

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

ロングバージョン:

残念ながら、これは実装されていません(11月24日)。回避策がある場合、私もそれを見つけることができません。 (まだ見ていると、ニュースで更新されます。) 出力を保存してから再印刷する回避策があります 、ただし、ノートブックでコードがまだ実行中の場合は動作しません。別の方法は、出力を取得できる2つ目のノートブックを用意することです。

私もこの機能が必要であり、同じ理由で。カーネルはシャットダウンせず、タブを閉じても中断しません。また、タブを閉じてもコードは実行を停止しません。与えられた警告は正確に「カーネルがビジーであり、出力が失われる可能性があります」です。

ランニング

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

1つのボックスで、タブを閉じてから再び開き、実行します

print(a)

別のボックスから100秒が終了してコードが完了するまでハングし、その後100が出力されます。

タブを閉じて戻るとき、pythonプロセスは、前回の保存が完了したとき)と同じ状態になります。実行コードからの出力は、実際にブラウザを開くとブラウザに送信されるため(これを説明するリファレンスが失われます)、 this comment のようなハックが機能しますそれらを受け取ることができ、いくつかのセルにそれらを投げるだけです。

出力は、エンドポイント接続を介してアクセス可能な方法でのみ保存されます。 彼らはこれにしばらく取り組んでいます(Jupyterの前) 、Jupyterリポジトリで現在のバグを見つけることができません( これはそれを参照していますが、そうではありません )。

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

関連する質問:

15
Poik

私もしばらくの間、この問題に苦労しています。

私の回避策は、すべてのログをファイルに書き込むことで、ブラウザを閉じると(実際にブラウザを介して多くのログがハングアップするとき)、ログファイルを開くとカーネルジョブプロセスを見ることができます(ログファイルは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)
2
flaviostutz

まず、インストール

ルニピー

pip install runipy

次に、以下のコマンドを使用して、ノートブックをバックグラウンドで実行します。

Nohup runipy YourNotebook.ipynb OutputNotebook.ipynb >> notebook.log &

これで出力ファイルが保存され、実行中にログを見ることができます:

tail -f notebook.log
0
Saitejareddy