*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/64cc3540-1cea-4260-9d85-a5122300419d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to