|
|
- """Replacements for sys.displayhook that publish over ZMQ."""
-
- # Copyright (c) IPython Development Team.
- # Distributed under the terms of the Modified BSD License.
-
- import sys
-
- from IPython.core.displayhook import DisplayHook
- from ipykernel.jsonutil import encode_images, json_clean
- from ipython_genutils.py3compat import builtin_mod
- from traitlets import Instance, Dict, Any
- from jupyter_client.session import extract_header, Session
-
-
- class ZMQDisplayHook(object):
- """A simple displayhook that publishes the object's repr over a ZeroMQ
- socket."""
- topic = b'execute_result'
-
- def __init__(self, session, pub_socket):
- self.session = session
- self.pub_socket = pub_socket
- self.parent_header = {}
-
- def get_execution_count(self):
- """This method is replaced in kernelapp"""
- return 0
-
- def __call__(self, obj):
- if obj is None:
- return
-
- builtin_mod._ = obj
- sys.stdout.flush()
- sys.stderr.flush()
- contents = {u'execution_count': self.get_execution_count(),
- u'data': {'text/plain': repr(obj)},
- u'metadata': {}}
- self.session.send(self.pub_socket, u'execute_result', contents,
- parent=self.parent_header, ident=self.topic)
-
- def set_parent(self, parent):
- self.parent_header = extract_header(parent)
-
-
- class ZMQShellDisplayHook(DisplayHook):
- """A displayhook subclass that publishes data using ZeroMQ. This is intended
- to work with an InteractiveShell instance. It sends a dict of different
- representations of the object."""
- topic=None
-
- session = Instance(Session, allow_none=True)
- pub_socket = Any(allow_none=True)
- parent_header = Dict({})
-
- def set_parent(self, parent):
- """Set the parent for outbound messages."""
- self.parent_header = extract_header(parent)
-
- def start_displayhook(self):
- self.msg = self.session.msg(u'execute_result', {
- 'data': {},
- 'metadata': {},
- }, parent=self.parent_header)
-
- def write_output_prompt(self):
- """Write the output prompt."""
- self.msg['content']['execution_count'] = self.prompt_count
-
- def write_format_data(self, format_dict, md_dict=None):
- self.msg['content']['data'] = json_clean(encode_images(format_dict))
- self.msg['content']['metadata'] = md_dict
-
- def finish_displayhook(self):
- """Finish up all displayhook activities."""
- sys.stdout.flush()
- sys.stderr.flush()
- if self.msg['content']['data']:
- self.session.send(self.pub_socket, self.msg, ident=self.topic)
- self.msg = None
|