zmqshell.py
72 lines
| 2.3 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r2773 | import sys | ||
from subprocess import Popen, PIPE | ||||
Brian Granger
|
r2786 | |||
from IPython.core.interactiveshell import ( | ||||
InteractiveShell, InteractiveShellABC | ||||
) | ||||
from IPython.core.displayhook import DisplayHook | ||||
from IPython.utils.traitlets import Instance, Type, Dict | ||||
from IPython.zmq.session import extract_header | ||||
Brian Granger
|
r2791 | class ZMQDisplayHook(DisplayHook): | ||
Brian Granger
|
r2786 | |||
session = Instance('IPython.zmq.session.Session') | ||||
pub_socket = Instance('zmq.Socket') | ||||
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'pyout', {}, parent=self.parent_header) | ||||
def write_output_prompt(self): | ||||
"""Write the output prompt.""" | ||||
if self.do_full_cache: | ||||
self.msg['content']['output_sep'] = self.output_sep | ||||
self.msg['content']['prompt_string'] = str(self.prompt_out) | ||||
self.msg['content']['prompt_number'] = self.prompt_count | ||||
self.msg['content']['output_sep2'] = self.output_sep2 | ||||
def write_result_repr(self, result_repr): | ||||
self.msg['content']['data'] = result_repr | ||||
def finish_displayhook(self): | ||||
"""Finish up all displayhook activities.""" | ||||
self.pub_socket.send_json(self.msg) | ||||
self.msg = None | ||||
Brian Granger
|
r2773 | |||
class ZMQInteractiveShell(InteractiveShell): | ||||
"""A subclass of InteractiveShell for ZMQ.""" | ||||
Brian Granger
|
r2791 | displayhook_class = Type(ZMQDisplayHook) | ||
Brian Granger
|
r2786 | |||
Brian Granger
|
r2773 | def system(self, cmd): | ||
cmd = self.var_expand(cmd, depth=2) | ||||
Brian Granger
|
r2774 | sys.stdout.flush() | ||
sys.stderr.flush() | ||||
Brian Granger
|
r2773 | p = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE) | ||
for line in p.stdout.read().split('\n'): | ||||
if len(line) > 0: | ||||
print line | ||||
for line in p.stderr.read().split('\n'): | ||||
if len(line) > 0: | ||||
print line | ||||
Brian Granger
|
r2781 | p.wait() | ||
Brian Granger
|
r2773 | |||
Brian Granger
|
r2775 | def init_io(self): | ||
# This will just use sys.stdout and sys.stderr. If you want to | ||||
# override sys.stdout and sys.stderr themselves, you need to do that | ||||
# *before* instantiating this class, because Term holds onto | ||||
# references to the underlying streams. | ||||
import IPython.utils.io | ||||
Term = IPython.utils.io.IOTerm() | ||||
IPython.utils.io.Term = Term | ||||
Brian Granger
|
r2773 | InteractiveShellABC.register(ZMQInteractiveShell) | ||
Brian Granger
|
r2786 | |||