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'