Looking through the code a bit more I found this code snippet in
jupyter_client/manager.py
<https://github.com/jupyter/jupyter_client/blob/master/jupyter_client/manager.py#L188-L193>
:
def _launch_kernel(self, kernel_cmd, **kw):
"""actually launch the kernel
override in a subclass to launch kernel subprocesses differently
"""
return launch_kernel(kernel_cmd, **kw)
I know the PID of the running kernel process. If I could somehow do a
subprocess.Popen() on that existing process and return a reference to that,
I think that would work.
Unfortunately I can't anything related to doing a subprocess.Popen() on an
*existing* process...
On Tuesday, February 13, 2018 at 1:50:04 PM UTC-8, Edward Banner wrote:
>
> *Arg! I can't seem to get formatting down on google forums. I apologize.
> Here is my response in full.*
>
> Hi Roland,
>
> Thanks for your response. Your suggestion makes sense. But does that mean
> going with a custom server extension
> <http://jupyter-notebook.readthedocs.io/en/stable/extending/handlers.html> is
> the way to go?
>
> I spent yesterday attempting to accomplish this solely though jupyter
> configuration options. For a running kernel with information
>
> {
> "shell_port": 63391,
> "iopub_port": 63394,
> "stdin_port": 63392,
> "control_port": 63393,
> "hb_port": 63396,
> "ip": "127.0.0.1",
> "key": "fff108f8-b1bf9b17aa337ce7d3d14565",
> "transport": "tcp",
> "signature_scheme": "hmac-sha256",
> "kernel_name": ""
> }
>
> I set the following variables in jupyter_notebook_config.py.
>
> c.ConnectionFileMixin.connection_file =
> '/Users/ebanner/Library/Jupyter/runtime/kernel-10962.json'
> c.ConnectionFileMixin.control_port = 63393
> c.ConnectionFileMixin.iopub_port = 63394
> c.ConnectionFileMixin.stdin_port = 63392
> c.ConnectionFileMixin.hb_port = 63396
> c.ConnectionFileMixin.ip = '127.0.0.1'
> c.ConnectionFileMixin.shell_port = 63391
> c.ConnectionFileMixin.transport = 'tcp'
>
> However when I created a new notebook I get errors like
>
> [I 12:53:44.981 NotebookApp] KernelRestarter: restarting kernel (1/5)
> [D 12:53:44.982 NotebookApp] Starting kernel: [
> '/Users/ebanner/.anaconda/envs/py36/bin/python', '-m',
> 'ipykernel_launcher', '-f',
> '/Users/ebanner/Library/Jupyter/runtime/kernel-f746726f-0d27-4d63-b520-2f1c84bf5196.json'
> ]
> [D 12:53:44.986 NotebookApp] Connecting to: tcp://127.0.0.1:63393
> Traceback (most recent call last):
> File "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/runpy.py", line
> 193, in _run_module_as_main
> "__main__", mod_spec)
> File "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/runpy.py", line
> 85, in _run_code
> exec(code, run_globals)
> File
> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/ipykernel_launcher.py"
> , line 16, in <module>
> app.launch_new_instance()
> File
> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/traitlets/config/application.py"
> , line 657, in launch_instance
> app.initialize(argv)
> File "<decorator-gen-123>", line 2, in initialize
> File
> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/traitlets/config/application.py"
> , line 87, in catch_config_error
> return method(app, *args, **kwargs)
> File
> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/ipykernel/kernelapp.py"
> , line 448, in initialize
> self.init_sockets()
> File
> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/ipykernel/kernelapp.py"
> , line 238, in init_sockets
> self.shell_port = self._bind_socket(self.shell_socket, self.shell_port
> )
> File
> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/ipykernel/kernelapp.py"
> , line 180, in _bind_socket
> s.bind("tcp://%s:%i" % (self.ip, port))
> File "zmq/backend/cython/socket.pyx", line 495, in zmq.backend.cython.
> socket.Socket.bind (zmq/backend/cython/socket.c:5653)
> File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.
> checkrc._check_rc (zmq/backend/cython/socket.c:10014)
> zmq.error.ZMQError: Address already in use
>
> until it hits the maximum number of retries. Presumably this is because
> the ipykernel command attempts to create a *new* socket but since it
> already exists it fails to do so.
>
> Thinking that I could "trick" jupyter into not using ipykernel and just
> use the existing sockets I set
>
> c.KernelManager.kernel_cmd = [
> '/Users/ebanner/.anaconda/envs/py36/bin/python', '/Users/ebanner/bar.py']
>
> where bar.py contains
>
> while True:
> pass
>
> After creating another new notebook I get
>
> [D 12:59:37.283 NotebookApp] Opening websocket /api/kernels/9a6c1e7d-12c4-
> 4d98-a0c6-1f227627f784/channels
> [D 12:59:37.283 NotebookApp] Connecting to: tcp://127.0.0.1:63391
> [D 12:59:37.284 NotebookApp] Connecting to: tcp://127.0.0.1:63394
> [D 12:59:37.284 NotebookApp] Connecting to: tcp://127.0.0.1:63392
>
> which gave me hope! But then when I tried to execute a cell it just hangs.
> I did notice that http://localhost:8888/api/kernels has the following
> information.
>
> [
> {
> id: "9b260abf-072f-48e2-b5f0-213d934418a2",
> name: "python3",
> last_activity: "2018-02-13T21:10:41.460182Z",
> execution_state: "starting",
> connections: 0
> }
> ]
>
> However the execution_state being stuck at "starting" and connections
> being at 0 make me think that bar.py isn't quite doing enough.
>
> Digging into the code a bit I found the object returned from the call to
> ipykernel is a subprocess.Popen() object. But I couldn't find anywhere else
> in the code except KernelManager.is_alive() where Popen.poll() is called
> on it
> <https://github.com/jupyter/jupyter_client/blob/38b81cc07ddf70c2f534f11c4f4ef0103bfd5fe2/jupyter_client/multikernelmanager.py#L204-L205>
> .
>
> I also tried creating a custom kernel manager class and set
>
> c.NotebookApp.kernel_manager_class =
> 'kernelmanager.ExistingMappingKernelManager'
>
> where kernelmanager.ExistingMappingKernelManager is the 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)
>
> but when I create a new notebook I get the error
>
> [E 13:08:17.169 NotebookApp] Unhandled error in API request
>
>
> Traceback (most recent call last):
>
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/notebook/base/handlers.py"
> , line 516, in wrapper
>
> result = yield gen.maybe_future(method(self, *args, **kwargs))
>
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/tornado/gen.py",
> line 1055, in run
>
> value = future.result()
>
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/tornado/concurrent.py"
> , line 238, in result
>
> raise_exc_info(self._exc_info)
>
>
> File "<string>", line 4, in raise_exc_info
>
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/tornado/gen.py",
> line 1063, in run
> yielded = self.gen.throw(*exc_info)
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/notebook/services/sessions/handlers.py"
> , line 75, in post
>
> type=mtype))
>
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/tornado/gen.py",
> line 1055, in run
>
> value = future.result()
>
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/tornado/concurrent.py"
> , line 238, in result
>
> raise_exc_info(self._exc_info)
>
> File "<string>", line 4, in raise_exc_info
>
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/tornado/gen.py",
> line 1069, in run
> yielded = self.gen.send(value)
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/notebook/services/sessions/sessionmanager.py"
> , line 81, in create_session
>
> self.save_session(session_id, path=path, name=name, type=type,
> kernel_id=kernel_id)
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/notebook/services/sessions/sessionmanager.py"
> , line 125, in save_session
>
> return self.get_session(session_id=session_id)
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/notebook/services/sessions/sessionmanager.py"
> , line 170, in get_session
> return self.row_to_model(row)
>
> File
> "/Users/ebanner/.anaconda/lib/python3.6/site-packages/notebook/services/sessions/sessionmanager.py"
> , line 209, in row_to_model
>
> raise KeyError
>
> KeyError
>
>
> [E 13:08:17.171 NotebookApp] {
>
> "Host": "localhost:8888",
>
> "Connection": "keep-alive",
>
> "Content-Length": "96",
>
> "Accept": "application/json, text/javascript, */*; q=0.01",
>
> "Origin": "http://localhost:8888",
>
> "X-Requested-With": "XMLHttpRequest",
>
>
> "X-Xsrftoken":
> "2|e5e3448b|a67102a2af982e0bece9d040d46b1c87|1516914005",
>
>
> "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)
> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
> ,
>
> "Content-Type": "application/json",
>
>
> "Referer": "http://localhost:8888/notebooks/Kernel%20Client.ipynb",
>
>
> "Accept-Encoding": "gzip, deflate, br",
>
>
> "Accept-Language": "en-US,en;q=0.9",
>
>
> "Cookie":
> "_xsrf=2|e5e3448b|a67102a2af982e0bece9d040d46b1c87|1516914005;
> username-localhost-8889=\"2|1:0|10:1517089627|23:username-localhost-8889|44:M2NiNzEzOGRjOGVhNDhlMzk0YjRlZGI2OWQ4M2RkZjk=|fcb4100a390a3d9608150659dc573ec135609a1e778f386e293b029e1fe016e3\";
>
> user
> name-localhost-8890=\"2|1:0|10:1518302103|23:username-localhost-8890|44:OTdjNGRhZGRjYTRlNGMxZjg0YzY4ZDIzZjU1NjEzYTQ=|6c9c7647d95641d6f2d7375d9d45130a96e9ed9ec690b2bca01b6652c23ccd05\";
>
> username-localhost-8888=\"2|1:0|10:1518555822|23:username-localhost-8888|44:M2M3OTdhYTh
>
> iNjQ2NDE3ZWEyZjA3Mjk2MzdjMjZlMmI=|e2c3fe789c16638c5fa4573a9d7626b87a00cb4d33ed1488122c6543b8832398\""
>
>
> }
>
> presumably because I did not call super(MappingKernelManager,
> self).start_kernel(**kwargs) which presumably does some important setup
> work.
>
> I *did* get a hacky solution "working" by the end of the day, though! I
> put the following code snippet in a jupyter notebook.
>
> from jupyter_client import BlockingKernelClient
>
> client = BlockingKernelClient()
> client.load_connection_file(
> '/Users/ebanner/Library/Jupyter/runtime/kernel-10962.json')
> client.start_channels()
>
> Then I am able to do client.execute_interactive(code) as many times as I
> want!
>
> Using this approach one way forward would be to create a magic command
> that wraps code in a call to client.execute_interactive(). However for a
> single notebook that would require having to put the magic inside every
> code cell, which I would rather avoid if possible.
>
> So my question is can I start a new jupyter notebook and attach it to a
> running IPython kernel with configurables alone? If so am I close? If not
> what would be the most promising direction to proceed? The closest example
> I can think to study is nb2kg <https://github.com/jupyter-incubator/nb2kg>
> which
> allows a jupyter notebook to attach to a remote kernel. However that kernel
> was started by a jupyter notebook so it still might not be close enough for
> my use case to solve my problem
>
> I truly appreciate any help I can get as I am running out of ideas.
>
> On Tuesday, February 13, 2018 at 1:28:46 PM UTC-8, Edward Banner wrote:
>>
>> Hi Roland,
>>
>> Thanks for your response. Your suggestion makes sense. But does that mean
>> going with a custom server extension
>> <http://jupyter-notebook.readthedocs.io/en/stable/extending/handlers.html>
>> is the way to go?
>>
>> I spent yesterday attempting to accomplish this solely though jupyter
>> configuration options. For a running kernel with information
>>
>> {
>> "shell_port": 63391,
>> "iopub_port": 63394,
>> "stdin_port": 63392,
>> "control_port": 63393,
>> "hb_port": 63396,
>> "ip": "127.0.0.1",
>> "key": "fff108f8-b1bf9b17aa337ce7d3d14565",
>> "transport": "tcp",
>> "signature_scheme": "hmac-sha256",
>> "kernel_name": ""
>> }
>>
>> I set the following variables in jupyter_notebook_config.py.
>>
>> c.ConnectionFileMixin.connection_file =
>> '/Users/ebanner/Library/Jupyter/runtime/kernel-10962.json'
>> c.ConnectionFileMixin.control_port = 63393
>> c.ConnectionFileMixin.iopub_port = 63394
>> c.ConnectionFileMixin.stdin_port = 63392
>> c.ConnectionFileMixin.hb_port = 63396
>> c.ConnectionFileMixin.ip = '127.0.0.1'
>> c.ConnectionFileMixin.shell_port = 63391
>> c.ConnectionFileMixin.transport = 'tcp'
>>
>> However when I created a new notebook I get errors like
>>
>> [I 12:53:44.981 NotebookApp] KernelRestarter: restarting kernel (1/5)
>> [D 12:53:44.982 NotebookApp] Starting kernel: [
>> '/Users/ebanner/.anaconda/envs/py36/bin/python', '-m',
>> 'ipykernel_launcher', '-f',
>> '/Users/ebanner/Library/Jupyter/runtime/kernel-f746726f-0d27-4d63-b520-2f1c84bf5196.json'
>> ]
>> [D 12:53:44.986 NotebookApp] Connecting to: tcp://127.0.0.1:63393
>> Traceback (most recent call last):
>> File "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/runpy.py", line
>> 193, in _run_module_as_main
>> "__main__", mod_spec)
>> File "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/runpy.py", line
>> 85, in _run_code
>> exec(code, run_globals)
>> File
>> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/ipykernel_launcher.py"
>> , line 16, in <module>
>> app.launch_new_instance()
>> File
>> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/traitlets/config/application.py"
>> , line 657, in launch_instance
>> app.initialize(argv)
>> File "<decorator-gen-123>", line 2, in initialize
>> File
>> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/traitlets/config/application.py"
>> , line 87, in catch_config_error
>> return method(app, *args, **kwargs)
>> File
>> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/ipykernel/kernelapp.py"
>> , line 448, in initialize
>> self.init_sockets()
>> File
>> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/ipykernel/kernelapp.py"
>> , line 238, in init_sockets
>> self.shell_port = self._bind_socket(self.shell_socket, self.
>> shell_port)
>> File
>> "/Users/ebanner/.anaconda/envs/py36/lib/python3.6/site-packages/ipykernel/kernelapp.py"
>> , line 180, in _bind_socket
>> s.bind("tcp://%s:%i" % (self.ip, port))
>> File "zmq/backend/cython/socket.pyx", line 495, in zmq.backend.cython.
>> socket.Socket.bind (zmq/backend/cython/socket.c:5653)
>> File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.
>> checkrc._check_rc (zmq/backend/cython/socket.c:10014)
>> zmq.error.ZMQError: Address already in use
>>
>> until it hits the maximum number of retries. Presumably this is because
>> the ipykernel command attempts to create a *new* socket but since it
>> already exists it fails to do so.
>>
>> Thinking that I could "trick" jupyter into not using ipykernel and just
>> use the existing sockets I set
>>
>> c.KernelManager.kernel_cmd = [
>> '/Users/ebanner/.anaconda/envs/py36/bin/python', '/Users/ebanner/bar.py']
>>
>> where bar.py contains
>>
>> while True:
>> pass
>>
>> After creating another new notebook I get
>>
>> [D 12:59:37.283 NotebookApp] Opening websocket /api/kernels/9a6c1e7d-12c4
>> -4d98-a0c6-1f227627f784/channels
>> [D 12:59:37.283 NotebookApp] Connecting to: tcp://127.0.0.1:63391
>> [D 12:59:37.284 NotebookApp] Connecting to: tcp://127.0.0.1:63394
>> [D 12:59:37.284 NotebookApp] Connecting to: tcp://127.0.0.1:63392
>>
>> which gave me hope! But then when I tried to execute a cell it just
>> hangs. I did notice that http://localhost:8888/api/kernels has the
>> following information.
>>
>> <span
>>
>
--
You received this message because you are subscribed to the Google Groups
"Project Jupyter" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jupyter/eb394188-0acc-4c17-ab4b-2ecd8e4dbc8a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.