在多个ipython笔记本中共享命名空间

use*_*258 7 ipython ipython-notebook

我想同时使用几个ipython笔记本共享相同的命名空间.目前有(ipython-1.1.0)这样做的方法吗?

我尝试在同一个ipython内核上创建不同的笔记本,但笔记本不共享命名空间.此外,我已经能够使用终端控制台和笔记本在同一名称空间上使用在IPython笔记本旁边使用IPython控制台的答案,但我找不到笔记本等效的--existing参数.

非常感谢

Lar*_*son 5

不幸的是,这不再有效,你得到错误消息ipython.kernel替换为ipython.parallel.

改变这种方式比上面更不优雅的方法是改变第273行的IPython/frontend/html/notebook/kernelmanager.py

kernel_id = self.kernel_for_notebook(notebook_id)

kernel_id = None
for notebook_id in self._notebook_mapping:
    kernel_id = self._notebook_mapping[notebook_id]
    break
Run Code Online (Sandbox Code Playgroud)

对于Anaconda python,将kernelmanager.py中的start_kernel替换为

def start_kernel(self, kernel_id=None, path=None, **kwargs):
    global saved_kernel_id
    if saved_kernel_id:
        return saved_kernel_id
    if kernel_id is None:
        kwargs['extra_arguments'] = self.kernel_argv
        if path is not None:
            kwargs['cwd'] = self.cwd_for_path(path)
        kernel_id = super(MappingKernelManager, self).start_kernel(**kwargs)
        self.log.info("Kernel started: %s" % kernel_id)
        self.log.debug("Kernel args: %r" % kwargs)
        self.add_restart_callback(kernel_id,
            lambda : self._handle_kernel_died(kernel_id),
            'dead',
        )
    else:
        self._check_kernel_id(kernel_id)
        self.log.info("Using existing kernel: %s" % kernel_id)
    saved_kernel_id = kernel_id
    return kernel_id
Run Code Online (Sandbox Code Playgroud)

并添加

    saved_kernel_id = None
Run Code Online (Sandbox Code Playgroud)

以上

    class MappingKernelManager(MultiKernelManager):
Run Code Online (Sandbox Code Playgroud)

真正的IPython大师,请提供正确的修复程序.很多使用笔记本电脑的人要共享内核的能力,这是自然的,因为一台笔记本电脑迅速增长得太大了单一的复杂的应用程序工作,所以它更容易能够应用分解成多个笔记本.

另外,大师,当你正在聆听时,像Mathematica那样拥有折叠扩展功能会很不错,所以你只能查看你关心的笔记本部分,你可以缩小其余部分.


min*_*nrk 4

IPython Notebook 没有等效的--existing. 笔记本电脑不共享内核。这不是笔记本本身的限制,它只是笔记本服务器代码中做出的设计决策。例如,可以修改服务器代码以使所有笔记本电脑共享相同的内核。您可以通过在 IPython 配置中进行一些猴子修补来完成此操作。首先创建一个配置文件:

$ ipython profile create singlekernel
[ProfileCreate] Generating default config file: u'~/.ipython/profile_singlekernel/ipython_config.py'
[ProfileCreate] Generating default config file: u'~/.ipython/profile_singlekernel/ipython_qtconsole_config.py'
[ProfileCreate] Generating default config file: u'~/.ipython/profile_singlekernel/ipython_notebook_config.py'
[ProfileCreate] Generating default config file: u'~/.ipython/profile_singlekernel/ipython_nbconvert_config.py'
Run Code Online (Sandbox Code Playgroud)

并编辑$(ipython locate profile singlekernel)/ipython_notebook_config.py以包含:

# Configuration file for ipython-notebook.

c = get_config()

import os
import uuid
from IPython.kernel.multikernelmanager import MultiKernelManager

def start_kernel(self, **kwargs):
    """Minimal override of MKM.start_kernel that always returns the same kernel"""
    kernel_id = kwargs.pop('kernel_id', str(uuid.uuid4()))
    if self.km is None:
        self.km = self.kernel_manager_factory(connection_file=os.path.join(
                self.connection_dir, "kernel-%s.json" % kernel_id),
                parent=self, autorestart=True, log=self.log
    )
    if not self.km.is_alive():
        self.log.info("starting single kernel")
        self.km.start_kernel(**kwargs)
    else:
        self.log.info("reusing existing kernel")
    self._kernels[kernel_id] = self.km
    return kernel_id

MultiKernelManager.km = None
MultiKernelManager.start_kernel = start_kernel
Run Code Online (Sandbox Code Playgroud)

这只是覆盖内核启动机制,仅启动一个内核并在每个后续请求时返回它,而不是为每个内核 ID 启动一个新内核。

现在,每当您启动笔记本服务器时

ipython notebook --profile singlekernel
Run Code Online (Sandbox Code Playgroud)

该会话中的所有笔记本都将共享相同的内核。