client.py
156 lines
| 5.5 KiB
| text/x-python
|
PythonLexer
MinRK
|
r10298 | """A client for in-process kernels.""" | ||
MinRK
|
r10297 | |||
#----------------------------------------------------------------------------- | ||||
# Copyright (C) 2012 The IPython Development Team | ||||
# | ||||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
MinRK
|
r10298 | # IPython imports | ||
Thomas Kluyver
|
r19222 | from IPython.kernel.inprocess.socket import DummySocket | ||
MinRK
|
r10298 | from IPython.utils.traitlets import Type, Instance | ||
from IPython.kernel.clientabc import KernelClientABC | ||||
from IPython.kernel.client import KernelClient | ||||
MinRK
|
r10297 | |||
MinRK
|
r10298 | # Local imports | ||
from .channels import ( | ||||
Thomas Kluyver
|
r19223 | InProcessChannel, | ||
MinRK
|
r10298 | InProcessHBChannel, | ||
MinRK
|
r10297 | |||
MinRK
|
r10298 | ) | ||
MinRK
|
r10297 | |||
#----------------------------------------------------------------------------- | ||||
MinRK
|
r10298 | # Main kernel Client class | ||
MinRK
|
r10297 | #----------------------------------------------------------------------------- | ||
MinRK
|
r10298 | class InProcessKernelClient(KernelClient): | ||
"""A client for an in-process kernel. | ||||
MinRK
|
r10297 | |||
This class implements the interface of | ||||
MinRK
|
r10298 | `IPython.kernel.clientabc.KernelClientABC` and allows | ||
MinRK
|
r10297 | (asynchronous) frontends to be used seamlessly with an in-process kernel. | ||
MinRK
|
r10298 | See `IPython.kernel.client.KernelClient` for docstrings. | ||
MinRK
|
r10297 | """ | ||
# The classes to use for the various channels. | ||||
Thomas Kluyver
|
r19223 | shell_channel_class = Type(InProcessChannel) | ||
iopub_channel_class = Type(InProcessChannel) | ||||
stdin_channel_class = Type(InProcessChannel) | ||||
MinRK
|
r10297 | hb_channel_class = Type(InProcessHBChannel) | ||
Thomas Kluyver
|
r17095 | kernel = Instance('IPython.kernel.inprocess.ipkernel.InProcessKernel') | ||
MinRK
|
r10297 | |||
#-------------------------------------------------------------------------- | ||||
MinRK
|
r10298 | # Channel management methods | ||
MinRK
|
r10297 | #-------------------------------------------------------------------------- | ||
MinRK
|
r10298 | def start_channels(self, *args, **kwargs): | ||
super(InProcessKernelClient, self).start_channels(self) | ||||
self.kernel.frontends.append(self) | ||||
MinRK
|
r10297 | |||
@property | ||||
def shell_channel(self): | ||||
if self._shell_channel is None: | ||||
self._shell_channel = self.shell_channel_class(self) | ||||
return self._shell_channel | ||||
@property | ||||
def iopub_channel(self): | ||||
if self._iopub_channel is None: | ||||
self._iopub_channel = self.iopub_channel_class(self) | ||||
return self._iopub_channel | ||||
@property | ||||
def stdin_channel(self): | ||||
if self._stdin_channel is None: | ||||
self._stdin_channel = self.stdin_channel_class(self) | ||||
return self._stdin_channel | ||||
@property | ||||
def hb_channel(self): | ||||
if self._hb_channel is None: | ||||
self._hb_channel = self.hb_channel_class(self) | ||||
return self._hb_channel | ||||
Thomas Kluyver
|
r19222 | # Methods for sending specific messages | ||
# ------------------------------------- | ||||
def execute(self, code, silent=False, store_history=True, | ||||
user_expressions={}, allow_stdin=None): | ||||
if allow_stdin is None: | ||||
allow_stdin = self.allow_stdin | ||||
content = dict(code=code, silent=silent, store_history=store_history, | ||||
user_expressions=user_expressions, | ||||
allow_stdin=allow_stdin) | ||||
msg = self.session.msg('execute_request', content) | ||||
self._dispatch_to_kernel(msg) | ||||
return msg['header']['msg_id'] | ||||
def complete(self, code, cursor_pos=None): | ||||
if cursor_pos is None: | ||||
cursor_pos = len(code) | ||||
content = dict(code=code, cursor_pos=cursor_pos) | ||||
msg = self.session.msg('complete_request', content) | ||||
self._dispatch_to_kernel(msg) | ||||
return msg['header']['msg_id'] | ||||
def inspect(self, code, cursor_pos=None, detail_level=0): | ||||
if cursor_pos is None: | ||||
cursor_pos = len(code) | ||||
content = dict(code=code, cursor_pos=cursor_pos, | ||||
detail_level=detail_level, | ||||
) | ||||
msg = self.session.msg('inspect_request', content) | ||||
self._dispatch_to_kernel(msg) | ||||
return msg['header']['msg_id'] | ||||
def history(self, raw=True, output=False, hist_access_type='range', **kwds): | ||||
content = dict(raw=raw, output=output, | ||||
hist_access_type=hist_access_type, **kwds) | ||||
msg = self.session.msg('history_request', content) | ||||
self._dispatch_to_kernel(msg) | ||||
return msg['header']['msg_id'] | ||||
def shutdown(self, restart=False): | ||||
# FIXME: What to do here? | ||||
raise NotImplementedError('Cannot shutdown in-process kernel') | ||||
def kernel_info(self): | ||||
"""Request kernel info.""" | ||||
msg = self.session.msg('kernel_info_request') | ||||
self._dispatch_to_kernel(msg) | ||||
return msg['header']['msg_id'] | ||||
def input(self, string): | ||||
if self.kernel is None: | ||||
raise RuntimeError('Cannot send input reply. No kernel exists.') | ||||
self.kernel.raw_input_str = string | ||||
def _dispatch_to_kernel(self, msg): | ||||
""" Send a message to the kernel and handle a reply. | ||||
""" | ||||
kernel = self.kernel | ||||
if kernel is None: | ||||
raise RuntimeError('Cannot send request. No kernel exists.') | ||||
stream = DummySocket() | ||||
self.session.send(stream, msg) | ||||
msg_parts = stream.recv_multipart() | ||||
kernel.dispatch_shell(stream, msg_parts) | ||||
idents, reply_msg = self.session.recv(stream, copy=False) | ||||
self.shell_channel.call_handlers_later(reply_msg) | ||||
MinRK
|
r10297 | |||
#----------------------------------------------------------------------------- | ||||
# ABC Registration | ||||
#----------------------------------------------------------------------------- | ||||
MinRK
|
r10298 | KernelClientABC.register(InProcessKernelClient) | ||