1

I am trying to run the groovy kernel as a sub-kernel in python. I have added custom cell magic in python, so when user types %%groovy groovy kernel should be started using jupyter_client manager and execute code. currently, I am having a problem with sending a response. any help is appreciated. here is my code so far:

from IPython.core.magic import (Magics, magics_class,cell_magic)
from jupyter_client import manager
from ipykernel.kernelbase import Kernel

@magics_class
class GroovyKernelMagic(Magics,Kernel):
    _execution_count = 1

    def run_cell(self, code):
        if not self.KernelManager.is_alive():
            Kernel.send_response(Kernel.iopub_socket, 'stream',
                               {'name': 'stdout', 'text': 'Restarting kernel "{}"\n'.format(self.KernelManager)})
            self.KernelManager.restart_kernel(now=False)
            self.KernelClient = self.KernelManager.client()
        while self.KernelClient.shell_channel.msg_ready():
            self.KernelClient.shell_channel.get_msg()
        self.KernelClient.execute(code, silent=False)

        _execution_state = "busy"
        while _execution_state != 'idle':
            while self.KernelClient.iopub_channel.msg_ready():
                sub_msg = self.KernelClient.iopub_channel.get_msg()
                msg_type = sub_msg['header']['msg_type']
                if msg_type == 'status':
                    _execution_state = sub_msg["content"]["execution_state"]
                else:
                    if msg_type in ('execute_input', 'execute_result'):
                        sub_msg['content']['execution_count'] = self._execution_count

                    Kernel.send_response(Kernel.iopub_socket, msg_type, sub_msg['content'])
        reply = self.KernelClient.get_shell_msg(timeout=10)
        reply['content']['execution_count'] = self._execution_count
        return reply['content']

    @cell_magic
    def groovy(self, line, cell):
        self.KernelManager, self.KernelClient = manager.start_new_kernel(startup_timeout=60, kernel_name='groovy')
        return self.run_cell(cell)


ip = get_ipython()
ip.register_magics(GroovyKernelMagic)

this is the error stack trace:

/testMagic.py in groovy(self, line, cell) 50 def groovy(self, line, cell): 51 self.KM, self.KC = manager.start_new_kernel(startup_timeout=60, kernel_name='groovy') ---> 52 return self.run_cell(cell) 53 54

/testMagic.py in run_cell(self, code) 42 print(msg_type) 43 print(sub_msg['content']) ---> 44 Kernel.send_response(Kernel.iopub_socket, msg_type, sub_msg['content']) 45 reply = self.KC.get_shell_msg(timeout=10) 46 reply['content']['execution_count'] = self._execution_count

anaconda3/lib/python3.5/site-packages/ipykernel/kernelbase.py in send_response(self, stream, msg_or_type, content, ident, buffers, track, header, metadata) 343 message. 344 """ --> 345 return self.session.send(stream, msg_or_type, content, self._parent_header, 346 ident, buffers, track, header, metadata) 347

AttributeError: 'Any' object has no attribute 'session'

fishera
  • 789
  • 2
  • 7
  • 26

0 Answers0