kernelmanager.py
118 lines
| 4.1 KiB
| text/x-python
|
PythonLexer
epatters
|
r2609 | """ A KernelManager that provides channels that use signals and slots. | ||
""" | ||||
# System library imports. | ||||
from PyQt4 import QtCore | ||||
# IPython imports. | ||||
epatters
|
r2611 | from IPython.zmq.kernelmanager import KernelManager, SubSocketChannel, \ | ||
epatters
|
r2609 | XReqSocketChannel, RepSocketChannel | ||
class QtSubSocketChannel(SubSocketChannel, QtCore.QObject): | ||||
# Emitted when any message is received. | ||||
epatters
|
r2611 | message_received = QtCore.pyqtSignal(object) | ||
epatters
|
r2609 | |||
# Emitted when a message of type 'pyout' or 'stdout' is received. | ||||
epatters
|
r2611 | output_received = QtCore.pyqtSignal(object) | ||
epatters
|
r2609 | |||
# Emitted when a message of type 'pyerr' or 'stderr' is received. | ||||
epatters
|
r2611 | error_received = QtCore.pyqtSignal(object) | ||
#--------------------------------------------------------------------------- | ||||
# 'object' interface | ||||
#--------------------------------------------------------------------------- | ||||
def __init__(self, *args, **kw): | ||||
""" Reimplemented to ensure that QtCore.QObject is initialized first. | ||||
""" | ||||
QtCore.QObject.__init__(self) | ||||
SubSocketChannel.__init__(self, *args, **kw) | ||||
epatters
|
r2609 | |||
#--------------------------------------------------------------------------- | ||||
# 'SubSocketChannel' interface | ||||
#--------------------------------------------------------------------------- | ||||
def call_handlers(self, msg): | ||||
""" Reimplemented to emit signals instead of making callbacks. | ||||
""" | ||||
# Emit the generic signal. | ||||
self.message_received.emit(msg) | ||||
# Emit signals for specialized message types. | ||||
msg_type = msg['msg_type'] | ||||
if msg_type in ('pyout', 'stdout'): | ||||
self.output_received.emit(msg) | ||||
elif msg_type in ('pyerr', 'stderr'): | ||||
self.error_received.emit(msg) | ||||
epatters
|
r2614 | def flush(self): | ||
""" Reimplemented to ensure that signals are dispatched immediately. | ||||
""" | ||||
super(QtSubSocketChannel, self).flush() | ||||
QtCore.QCoreApplication.instance().processEvents() | ||||
epatters
|
r2609 | |||
class QtXReqSocketChannel(XReqSocketChannel, QtCore.QObject): | ||||
# Emitted when any message is received. | ||||
epatters
|
r2611 | message_received = QtCore.pyqtSignal(object) | ||
epatters
|
r2609 | |||
# Emitted when a reply has been received for the corresponding request type. | ||||
epatters
|
r2611 | execute_reply = QtCore.pyqtSignal(object) | ||
complete_reply = QtCore.pyqtSignal(object) | ||||
object_info_reply = QtCore.pyqtSignal(object) | ||||
#--------------------------------------------------------------------------- | ||||
# 'object' interface | ||||
#--------------------------------------------------------------------------- | ||||
def __init__(self, *args, **kw): | ||||
""" Reimplemented to ensure that QtCore.QObject is initialized first. | ||||
""" | ||||
QtCore.QObject.__init__(self) | ||||
XReqSocketChannel.__init__(self, *args, **kw) | ||||
epatters
|
r2609 | |||
#--------------------------------------------------------------------------- | ||||
# 'XReqSocketChannel' interface | ||||
#--------------------------------------------------------------------------- | ||||
def call_handlers(self, msg): | ||||
""" Reimplemented to emit signals instead of making callbacks. | ||||
""" | ||||
# Emit the generic signal. | ||||
self.message_received.emit(msg) | ||||
# Emit signals for specialized message types. | ||||
msg_type = msg['msg_type'] | ||||
signal = getattr(self, msg_type, None) | ||||
if signal: | ||||
signal.emit(msg) | ||||
epatters
|
r2611 | def _queue_request(self, msg, callback): | ||
""" Reimplemented to skip callback handling. | ||||
""" | ||||
self.command_queue.put(msg) | ||||
epatters
|
r2609 | |||
class QtRepSocketChannel(RepSocketChannel, QtCore.QObject): | ||||
epatters
|
r2611 | #--------------------------------------------------------------------------- | ||
# 'object' interface | ||||
#--------------------------------------------------------------------------- | ||||
def __init__(self, *args, **kw): | ||||
""" Reimplemented to ensure that QtCore.QObject is initialized first. | ||||
""" | ||||
QtCore.QObject.__init__(self) | ||||
RepSocketChannel.__init__(self, *args, **kw) | ||||
class QtKernelManager(KernelManager): | ||||
""" A KernelManager that provides channels that use signals and slots. | ||||
""" | ||||
sub_channel_class = QtSubSocketChannel | ||||
xreq_channel_class = QtXReqSocketChannel | ||||
rep_channel_class = QtRepSocketChannel | ||||