如何将jupyter笔记本连接到现有的IPython内核?

时间:2018-02-13 23:49:21

标签: google-cloud-platform jupyter

我正在尝试将jupyter笔记本连接到IPython内核,该内核是通过IPython.kernel_embed()在jupyter笔记本服务器之外启动的。

我可以使用jupyter console --existing and jupyter qtconsole --existing很好地附加它,但由于笔记本不支持jupyter notebook标记,我无法使用--existing执行此操作。如this issue中所述,这不是因为任何技术限制,而是因为从UI角度来看会让人感到困惑。

我已经成功地与jupyter笔记本中的内核进行交互

from jupyter_client import BlockingKernelClient
client = BlockingKernelClient()
client.load_connection_file('/Users/ebanner/Library/Jupyter/runtime/kernel-10962.json')
client.start_channels()

并发布client.execute_interactive()。但是我真的想避免在每个单元格中运行client.execute_interactive()

我尝试过几件事。首先,我尝试更改c.ConnectionFileMixin.*_-port中的jupyter_notebook_config.py变量,并编写自己的自定义内核管理器并通过c.NotebookApp.kernel_manager_class将其设置为

from tornado import gen, web
from jupyter_client import KernelManager
from notebook.services.kernels.kernelmanager import MappingKernelManager

class ExistingMappingKernelManager(MappingKernelManager):
    """A KernelManager that just connects to an existing kernel."""

    @gen.coroutine
    def start_kernel(self, kernel_id=None, path=None, **kwargs):
        kernel_id = 1
        km = KernelManager(kernel_name='python3')
        kc = km.client()
        kc.load_connection_file('/Users/ebanner/Library/Jupyter/runtime/kernel-10962.json')
        kc.start_channels()
        try:
            kc.wait_for_ready()
        except RuntimeError:
            kc.stop_channels()
            raise
        raise gen.Return(kernel_id)

但到目前为止这些方法都失败了。

最有希望的路线似乎是覆盖KernelManager._launch_kernel(),虽然我不知道要覆盖它,因为它当前在由subprocess.Popen()启动的内核进程上返回ipykernel的实例

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我最终创建了一个hacky内核管理器,似乎可以完成这项工作。

https://github.com/ebanner/extipy

唯一需要注意的是,您必须禁用邮件身份验证才能使其正常工作,因为jupyter抱怨预期的邮件签名不匹配。

此处有更多讨论

https://groups.google.com/forum/#!topic/jupyter/qamkem52Xn0