jupyter/help

Connecting a notebook to an external IPython kernel?

ebanner opened this issue · 1 comments

I am attempting to connect a jupyter notebook to a IPython kernel which was started outside of a jupyter notebook server via IPython.kernel_embed().

I can attach to it just fine with jupyter console --existing and jupyter qtconsole --existing but I cannot do it with jupyter notebook as the notebook does not support the --existing flag. As mentioned in this issue this is not because of any technical limitation, but rather because it would be confusing from a UI perspective.

I am successfully able to interact with a kernel from a jupyter notebook with

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

and issue client.execute_interactive(). However I would really like to avoid running client.execute_interactive() in each and every cell.

I have tried several things. First I tried changing the c.ConnectionFileMixin.*_-port variables in jupyter_notebook_config.py and also writing my own custom kernel manager and setting it via c.NotebookApp.kernel_manager_class to

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)

but the approaches have all failed thus far.

The most promising route seems to be overriding KernelManager._launch_kernel(), though I am not sure what to override it with as it currently returns an instance of subprocess.Popen() on the kernel process started by ipykernel.

Any help would be greatly appreciated.