FirefoxのIPython Notebookで実行中のセルを分割するためのCTRL + Cに相当するものはありますか?


100

IPython Notebookを使い始めて、楽しんでいます。時々、大量のメモリを必要とする、または無限ループを含むバグのあるコードを書くことがあります。「割り込みカーネル」オプションの速度が遅い、または信頼性が低く、場合によってはカーネルを再起動しなければならず、メモリ内のすべてが失われます。

また、OS Xのメモリ不足を引き起こすスクリプトを作成することもあり、ハードリブートを行う必要があります。100%確実ではありませんが、以前にこのようなバグを記述し、ターミナルでPythonを実行したことがあれば、通常、スクリプトをCTRL+実行できCます。

Mac OS X上のFirefoxでIPythonノートブックのAnacondaディストリビューションを使用しています。


1
私は、0.13でcntrl + miショートカットまたはkernel> interruptドロップダウン(MacOSXのanacondaのデフォルト)を介して無限ループを中断することに成功したことがありません。この問題は1.0で修正されたようです。
KLDavenport 2013

回答:


55

私は間違っている可能性がありますが、「割り込みカーネル」ボタンは、現在実行しているコードにSIGINTシグナルを送信するだけだと確信しています(このアイデアは、フェルナンドのコメントサポートされています)、)。 CTRL + Cでできます。Python内の一部のプロセスは、他のプロセスよりも急にSIGINTを処理します。

iPython Notebookで実行中の何かを必死に停止する必要があり、ターミナルからiPython Notebookを起動した場合、そのターミナルでCTRL + Cを2回押して、iPython Notebookサーバー全体を中断できます。これにより、iPython Notebookが完全に停止します。つまり、作業を再開または保存することができなくなるため、これは明らかに優れたソリューションではありません(CTRL + Cを2回押す必要があります。これは、安全機能であるため、偶然にそれを行う)。ただし、緊急の場合は、通常、「カーネルの中断」ボタンよりも速くプロセスを強制終了します。


13
あるいは、問題のあるカーネルを再起動または停止することもできます-ipythonサーバーを強制終了するよりも徹底的ではありません。これは、Kernelドロップダウンまたはノートブックサーバーのページ(Shutdown問題のノートブックの名前の右側にあるボタン)から実行できます。
drevicko 2013年

1
残念ながら、ブラウザが応答しなくなって、サーバーページにアクセスできなくなる可能性があります。
K.-Michael Aye 2014

でプロセスを中断する方法はありjupyter-consoleますか?II / control-cが機能しません。そして、カーネルを再起動する他のショートカットはありません。
alpha_989 2018

75

I2回押すと、カーネルに割り込むことができます。

これは、コマンドモードの場合にのみ機能します。まだ有効になっていない場合は、を押しEscて有効にします。


これは、IPythonの特定のバージョン範囲または特定のOS用ですか?
グレッグ

6

以下はIPython Notebookのショートカットです。

Ctrl-m iカーネルに割り込みます。(つまり、iの後の唯一の文字Ctrl-m

この回答によると、I2回も動作します。


5

上記に追加するには:割り込みが機能しない場合は、カーネルを再起動できます。

カーネルのドロップダウン>>再起動>>再起動に移動し、出力をクリアします。通常はこれでうまくいきます。それでも解決しない場合は、ターミナル(またはタスクマネージャー)でカーネルを強制終了してから再起動します。

割り込みはすべてのプロセスでうまく機能しません。私は特にRカーネルを使用してこの問題を抱えています。


このトリックは私のためにそれをしました:20億エントリのマルチコアkmeansクラスタリングのために完全に応答しないJupyter Notebook(以前に知られているはずです)
Alex

3

更新:私のソリューションをスタンドアロンのPythonスクリプトに変えました。

この解決策によって、私は何度も救われました。うまくいけば、他の人もそれが役に立つと思う。このpythonスクリプトは、cpu_thresholdCPU 以外を使用しているすべてのjupyterカーネルを検出SIGINTし、カーネル(KeyboardInterrupt)にを送信するようにユーザーに求めます。SIGINTカーネルのCPU使用率が下回るまで送信を続けますcpu_threshold。誤動作しているカーネルが複数ある場合は、ユーザーにそれらのそれぞれを中断するように求めます(CPU使用率の高いものから低いものの順に並べます)。jupyter apiを使用してjupyterカーネルの名前を見つけるコードを作成してくれたgcbeltraminiに感謝します。このスクリプトはpython3を搭載したMACOSでテストされており、jupyterノートブック、リクエスト、json、psutilが必要です。

スクリプトをホームディレクトリに配置すると、使用法は次のようになります。

python ~/interrupt_bad_kernels.py
Interrupt kernel chews cpu.ipynb; PID: 57588; CPU: 2.3%? (y/n) y

以下のスクリプトコード:

from os import getpid, kill
from time import sleep
import re
import signal

from notebook.notebookapp import list_running_servers
from requests import get
from requests.compat import urljoin
import ipykernel
import json
import psutil


def get_active_kernels(cpu_threshold):
    """Get a list of active jupyter kernels."""
    active_kernels = []
    pids = psutil.pids()
    my_pid = getpid()

    for pid in pids:
        if pid == my_pid:
            continue
        try:
            p = psutil.Process(pid)
            cmd = p.cmdline()
            for arg in cmd:
                if arg.count('ipykernel'):
                    cpu = p.cpu_percent(interval=0.1)
                    if cpu > cpu_threshold:
                        active_kernels.append((cpu, pid, cmd))
        except psutil.AccessDenied:
            continue
    return active_kernels


def interrupt_bad_notebooks(cpu_threshold=0.2):
    """Interrupt active jupyter kernels. Prompts the user for each kernel."""

    active_kernels = sorted(get_active_kernels(cpu_threshold), reverse=True)

    servers = list_running_servers()
    for ss in servers:
        response = get(urljoin(ss['url'].replace('localhost', '127.0.0.1'), 'api/sessions'),
                       params={'token': ss.get('token', '')})
        for nn in json.loads(response.text):
            for kernel in active_kernels:
                for arg in kernel[-1]:
                    if arg.count(nn['kernel']['id']):
                        pid = kernel[1]
                        cpu = kernel[0]
                        interrupt = input(
                            'Interrupt kernel {}; PID: {}; CPU: {}%? (y/n) '.format(nn['notebook']['path'], pid, cpu))
                        if interrupt.lower() == 'y':
                            p = psutil.Process(pid)
                            while p.cpu_percent(interval=0.1) > cpu_threshold:
                                kill(pid, signal.SIGINT)
                                sleep(0.5)

if __name__ == '__main__':
    interrupt_bad_notebooks()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.