是否有一个与CTRL+;在Firefox的IPython笔记本中使用C来破坏正在运行的单元格?

是否有一个与CTRL+;在Firefox的IPython笔记本中使用C来破坏正在运行的单元格?,python,ipython,jupyter-notebook,Python,Ipython,Jupyter Notebook,我已经开始使用IPython笔记本,我很喜欢它。有时,我编写的错误代码需要大量内存或有无限循环。我发现“中断内核”选项缓慢或不可靠,有时我不得不重新启动内核,丢失内存中的所有内容 我有时也会编写导致OSX内存不足的脚本,我必须进行硬重启。我不是100%确定,但是当我以前写过这样的bug并在终端上运行Python时,我通常可以在脚本中按CTRL+C组合键 我将IPython笔记本电脑的Anaconda发行版与Mac OS X上的Firefox一起使用。我可能错了,但我非常确定“中断内核”按钮只会向

我已经开始使用IPython笔记本,我很喜欢它。有时,我编写的错误代码需要大量内存或有无限循环。我发现“中断内核”选项缓慢或不可靠,有时我不得不重新启动内核,丢失内存中的所有内容

我有时也会编写导致OSX内存不足的脚本,我必须进行硬重启。我不是100%确定,但是当我以前写过这样的bug并在终端上运行Python时,我通常可以在脚本中按CTRL+C组合键


我将IPython笔记本电脑的Anaconda发行版与Mac OS X上的Firefox一起使用。

我可能错了,但我非常确定“中断内核”按钮只会向您当前运行的代码发送一个SIGINT信号(Fernando的评论支持这个想法),这与按CTRL+C的操作相同。python中的某些进程比其他进程更突然地处理sigint


如果您迫切需要停止iPython Notebook中正在运行的某些内容,并且您从终端启动了iPython Notebook,则可以在该终端中按CTRL+C两次以中断整个iPython Notebook服务器。这将使iPython笔记本全部停止,这意味着不可能重新启动或保存您的工作,因此这显然不是一个很好的解决方案(您需要按CTRL+C两次,因为这是一个安全功能,所以人们不会意外地这样做)。但是,在紧急情况下,它通常比“中断内核”按钮更快地终止进程。

您可以按两次
I
来中断内核

这仅在您处于命令模式时有效。如果尚未启用,请按Esc键启用。

是IPython笔记本的快捷方式

Ctrl-mi
中断内核。(即,
Ctrl-m
之后的唯一字母i)


根据答案,
I
两次也可以工作。

补充一点:如果中断不工作,可以重新启动内核

转到内核下拉列表>>重新启动>>重新启动并清除输出。这通常能奏效。如果这仍然不起作用,请在终端(或任务管理器)中杀死内核,然后重新启动


中断并不适用于所有进程。我在使用R内核时尤其遇到这个问题。

更新:将我的解决方案转换为独立的python脚本

这个解决方案救了我不止一次。希望其他人发现它有用。此python脚本将查找任何使用超过
cpu\u阈值的jupyter内核,并提示用户向内核发送
SIGINT
(键盘中断)。它将继续发送
SIGINT
,直到内核的cpu使用率低于
cpu\u阈值。如果有多个行为不正常的内核,它将提示用户中断每个内核(按最高CPU使用率到最低CPU使用率排序)。非常感谢您编写代码,使用jupyter api查找jupyter内核的名称。该脚本在MACOS上使用python3进行了测试,需要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()

我从未成功地通过cntrl+mi快捷方式或0.13中的kernel>interrupt下拉菜单(默认为MacOSX上的anaconda)中断过无限循环。这个问题似乎在1.0中得到了修复。或者,您可以重新启动或停止有问题的内核,这比杀死ipython服务器要简单。这可以通过
内核
下拉列表或笔记本服务器页面(出现问题的笔记本名称右侧的
关机
按钮)完成。不幸的是,浏览器可能变得如此无响应,很难访问服务器页面。是否有方法中断jupyter控制台中的进程?II/控制-c不起作用。没有其他捷径可以重新启动内核。这是针对特定版本范围的IPython还是特定操作系统?这个技巧为我做到了:由于20亿个条目的多核kmeans群集,Jupyter笔记本完全没有响应(以前应该知道)