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

时间:2013-11-20 08:48:21

标签: ipython ipython-notebook

我想同时使用多个ipython笔记本共享相同的命名空间。目前(ipython-1.1.0)是否有办法实现这一目标?

我尝试在同一个ipython内核上创建不同的笔记本,但笔记本不共享命名空间。此外,我已经能够使用Using IPython console along side IPython notebook中的答案在同一名称空间的笔记本旁边使用终端控制台,但我无法找到与 - 现存参数相当的笔记本。 / p>

非常感谢

2 个答案:

答案 0 :(得分: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

对于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

并添加

    saved_kernel_id = None

上面

    class MappingKernelManager(MultiKernelManager):

真正的IPython大师,请提供正确的解决方案。许多使用笔记本电脑的人都希望能够共享内核,这很自然,因为一台笔记本电脑很快就会变得太大而无法使用单一的复杂应用程序,因此更容易将应用程序分解为多个笔记本电脑。

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

答案 1 :(得分:4)

IPython Notebook没有等效的--existing。笔记本不共享内核。它不是笔记本电脑本身的限制,它只是笔记本电脑服务器代码中的一个设计决定。例如,可以修改服务器代码以使所有笔记本共享相同的内核。您可以在IPython配置中使用一点monkeypatching来完成此操作。首先创建个人资料:

$ 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'

并修改$(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

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

现在每当您使用

启动笔记本服务器时
ipython notebook --profile singlekernel

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