##// END OF EJS Templates
Improve three-state read-only logic.
Improve three-state read-only logic.

File last commit:

r4952:a2ac298e
r5721:5b10f055
Show More
pykernel.py
282 lines | 10.4 KiB | text/x-python | PythonLexer
Fernando Perez
Added zmq kernel file which I forgot
r2598 #!/usr/bin/env python
"""A simple interactive kernel that talks to a frontend over 0MQ.
Things to do:
* Implement `set_parent` logic. Right before doing exec, the Kernel should
call set_parent on all the PUB objects with the message about to be executed.
* Implement random port and security key logic.
* Implement control messages.
* Implement event loop and poll version.
"""
epatters
Kernel subprocess parent polling is now implemented for Windows.
r2712 #-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
epatters
* Added a function for spawning a localhost kernel in a new process on random ports....
r2641 # Standard library imports.
Fernando Perez
Added zmq kernel file which I forgot
r2598 import __builtin__
epatters
Fixed bugs with raw_input and finished and implementing InStream.
r2708 from code import CommandCompiler
Fernando Perez
Added zmq kernel file which I forgot
r2598 import sys
import time
import traceback
epatters
* Added a function for spawning a localhost kernel in a new process on random ports....
r2641 # System library imports.
Fernando Perez
Added zmq kernel file which I forgot
r2598 import zmq
epatters
* Added a function for spawning a localhost kernel in a new process on random ports....
r2641 # Local imports.
Thomas Kluyver
Override input(), not raw_input(), for Qt console in Python 3.
r4772 from IPython.utils import py3compat
MinRK
zmq kernels now started via newapp
r3970 from IPython.utils.traitlets import HasTraits, Instance, Dict, Float
Fernando Perez
Added zmq kernel file which I forgot
r2598 from completer import KernelCompleter
MinRK
zmq kernels now started via newapp
r3970 from entry_point import base_launch_kernel
epatters
* Restored functionality after major merge....
r2778 from session import Session, Message
MinRK
zmq kernels now started via newapp
r3970 from kernelapp import KernelApp
Fernando Perez
Added zmq kernel file which I forgot
r2598
epatters
Kernel subprocess parent polling is now implemented for Windows.
r2712 #-----------------------------------------------------------------------------
Brian Granger
Remaned kernel.py to pykernel.py and create ipkernel.py.
r2755 # Main kernel class
epatters
Kernel subprocess parent polling is now implemented for Windows.
r2712 #-----------------------------------------------------------------------------
epatters
* Added a function for spawning a localhost kernel in a new process on random ports....
r2641
epatters
* Restored functionality after major merge....
r2778 class Kernel(HasTraits):
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756
epatters
Minimal updates to pure Python kernel to keep it (somewhat) API compatible with the IPython Kernel....
r3028 # Private interface
MinRK
copy _execute_sleep trait from ipkernel to pykernel...
r3935 # Time to sleep after flushing the stdout/err buffers in each execute
# cycle. While this introduces a hard limit on the minimal latency of the
# execute cycle, it helps prevent output synchronization problems for
# clients.
# Units are in seconds. The minimum zmq latency on local host is probably
# ~150 microseconds, set this to 500us for now. We may need to increase it
# a little if it's not enough after more interactive testing.
_execute_sleep = Float(0.0005, config=True)
epatters
Minimal updates to pure Python kernel to keep it (somewhat) API compatible with the IPython Kernel....
r3028 # This is a dict of port number that the kernel is listening on. It is set
# by record_ports and used by connect_request.
MinRK
zmq kernels now started via newapp
r3970 _recorded_ports = Dict()
epatters
Minimal updates to pure Python kernel to keep it (somewhat) API compatible with the IPython Kernel....
r3028
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 #---------------------------------------------------------------------------
# Kernel interface
#---------------------------------------------------------------------------
epatters
* Restored functionality after major merge....
r2778 session = Instance(Session)
MinRK
zmq kernels now started via newapp
r3970 shell_socket = Instance('zmq.Socket')
iopub_socket = Instance('zmq.Socket')
stdin_socket = Instance('zmq.Socket')
MinRK
use logging instead of `print >>` in pykernel
r3981 log = Instance('logging.Logger')
epatters
* Restored functionality after major merge....
r2778
def __init__(self, **kwargs):
super(Kernel, self).__init__(**kwargs)
Fernando Perez
Added zmq kernel file which I forgot
r2598 self.user_ns = {}
self.history = []
self.compiler = CommandCompiler()
self.completer = KernelCompleter(self.user_ns)
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756
Fernando Perez
Added zmq kernel file which I forgot
r2598 # Build dict of handlers for message types
Bernardo B. Marques
remove all trailling spaces
r4872 msg_types = [ 'execute_request', 'complete_request',
MinRK
pykernel handles shutdown_request
r3088 'object_info_request', 'shutdown_request' ]
Fernando Perez
Added zmq kernel file which I forgot
r2598 self.handlers = {}
epatters
* Adding object_info_request support to prototype kernel....
r2612 for msg_type in msg_types:
Fernando Perez
Added zmq kernel file which I forgot
r2598 self.handlers[msg_type] = getattr(self, msg_type)
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 def start(self):
""" Start the kernel main loop.
"""
Fernando Perez
Added zmq kernel file which I forgot
r2598 while True:
MinRK
zmq kernels now started via newapp
r3970 ident,msg = self.session.recv(self.shell_socket,0)
MinRK
all sends/recvs now via Session.send/recv....
r3269 assert ident is not None, "Missing message part."
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 omsg = Message(msg)
MinRK
use logging instead of `print >>` in pykernel
r3981 self.log.debug(str(omsg))
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 handler = self.handlers.get(omsg.msg_type, None)
if handler is None:
MinRK
use logging instead of `print >>` in pykernel
r3981 self.log.error("UNKNOWN MESSAGE TYPE: %s"%omsg)
Fernando Perez
Added zmq kernel file which I forgot
r2598 else:
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 handler(ident, omsg)
MinRK
zmq kernels now started via newapp
r3970 def record_ports(self, ports):
epatters
Minimal updates to pure Python kernel to keep it (somewhat) API compatible with the IPython Kernel....
r3028 """Record the ports that this kernel is using.
The creator of the Kernel instance must call this methods if they
want the :meth:`connect_request` method to return the port numbers.
"""
MinRK
zmq kernels now started via newapp
r3970 self._recorded_ports = ports
epatters
Minimal updates to pure Python kernel to keep it (somewhat) API compatible with the IPython Kernel....
r3028
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 #---------------------------------------------------------------------------
# Kernel request handlers
#---------------------------------------------------------------------------
Fernando Perez
Added zmq kernel file which I forgot
r2598
def execute_request(self, ident, parent):
try:
code = parent[u'content'][u'code']
except:
MinRK
use logging instead of `print >>` in pykernel
r3981 self.log.error("Got bad msg: %s"%Message(parent))
Fernando Perez
Added zmq kernel file which I forgot
r2598 return
MinRK
zmq kernels now started via newapp
r3970 pyin_msg = self.session.send(self.iopub_socket, u'pyin',{u'code':code}, parent=parent)
epatters
Greatly increased frontend performance by improving kernel stdout/stderr buffering.
r2722
Fernando Perez
Added zmq kernel file which I forgot
r2598 try:
comp_code = self.compiler(code, '<zmq-kernel>')
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730
Bernardo B. Marques
remove all trailling spaces
r4872 # Replace raw_input. Note that is not sufficient to replace
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 # raw_input in the user namespace.
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 raw_input = lambda prompt='': self._raw_input(prompt, ident, parent)
Thomas Kluyver
Override input(), not raw_input(), for Qt console in Python 3.
r4772 if py3compat.PY3:
__builtin__.input = raw_input
else:
__builtin__.raw_input = raw_input
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730
epatters
* The Qt console frontend now ignores cross chatter from other frontends....
r2824 # Set the parent message of the display hook and out streams.
Fernando Perez
Added zmq kernel file which I forgot
r2598 sys.displayhook.set_parent(parent)
epatters
* The Qt console frontend now ignores cross chatter from other frontends....
r2824 sys.stdout.set_parent(parent)
sys.stderr.set_parent(parent)
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730
Fernando Perez
Added zmq kernel file which I forgot
r2598 exec comp_code in self.user_ns, self.user_ns
except:
etype, evalue, tb = sys.exc_info()
tb = traceback.format_exception(etype, evalue, tb)
exc_content = {
u'status' : u'error',
u'traceback' : tb,
epatters
* Moved AnsiCodeProcessor to separate file, refactored its API, and added unit tests....
r2716 u'ename' : unicode(etype.__name__),
Fernando Perez
Added zmq kernel file which I forgot
r2598 u'evalue' : unicode(evalue)
}
MinRK
zmq kernels now started via newapp
r3970 exc_msg = self.session.send(self.iopub_socket, u'pyerr', exc_content, parent)
Fernando Perez
Added zmq kernel file which I forgot
r2598 reply_content = exc_content
else:
epatters
* Restored functionality after major merge....
r2778 reply_content = { 'status' : 'ok', 'payload' : {} }
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
Greatly increased frontend performance by improving kernel stdout/stderr buffering.
r2722 # Flush output before sending the reply.
sys.stderr.flush()
sys.stdout.flush()
MinRK
copy _execute_sleep trait from ipkernel to pykernel...
r3935 # FIXME: on rare occasions, the flush doesn't seem to make it to the
# clients... This seems to mitigate the problem, but we definitely need
# to better understand what's going on.
if self._execute_sleep:
time.sleep(self._execute_sleep)
epatters
Greatly increased frontend performance by improving kernel stdout/stderr buffering.
r2722
# Send the reply.
MinRK
zmq kernels now started via newapp
r3970 reply_msg = self.session.send(self.shell_socket, u'execute_reply', reply_content, parent, ident=ident)
MinRK
use logging instead of `print >>` in pykernel
r3981 self.log.debug(Message(reply_msg))
Fernando Perez
Added zmq kernel file which I forgot
r2598 if reply_msg['content']['status'] == u'error':
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 self._abort_queue()
def complete_request(self, ident, parent):
epatters
Fixed regressions in the pure Python kernel.
r2867 matches = {'matches' : self._complete(parent),
epatters
* Restored functionality after major merge....
r2778 'status' : 'ok'}
MinRK
zmq kernels now started via newapp
r3970 completion_msg = self.session.send(self.shell_socket, 'complete_reply',
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 matches, parent, ident)
MinRK
use logging instead of `print >>` in pykernel
r3981 self.log.debug(completion_msg)
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756
def object_info_request(self, ident, parent):
context = parent['content']['oname'].split('.')
object_info = self._object_info(context)
MinRK
zmq kernels now started via newapp
r3970 msg = self.session.send(self.shell_socket, 'object_info_reply',
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 object_info, parent, ident)
MinRK
use logging instead of `print >>` in pykernel
r3981 self.log.debug(msg)
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756
MinRK
pykernel handles shutdown_request
r3088 def shutdown_request(self, ident, parent):
content = dict(parent['content'])
MinRK
zmq kernels now started via newapp
r3970 msg = self.session.send(self.shell_socket, 'shutdown_reply',
MinRK
pykernel handles shutdown_request
r3088 content, parent, ident)
MinRK
zmq kernels now started via newapp
r3970 msg = self.session.send(self.iopub_socket, 'shutdown_reply',
MinRK
added reset:<bool> to shutdown_request content; shutdown_message broadcast on PUB for multiclient notification
r3089 content, parent, ident)
MinRK
use logging instead of `print >>` in pykernel
r3981 self.log.debug(msg)
MinRK
pykernel handles shutdown_request
r3088 time.sleep(0.1)
sys.exit(0)
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 #---------------------------------------------------------------------------
# Protected interface
#---------------------------------------------------------------------------
def _abort_queue(self):
while True:
MinRK
use logging instead of `print >>` in pykernel
r3981 ident,msg = self.session.recv(self.shell_socket, zmq.NOBLOCK)
MinRK
properly handle nothing to recv in pykernel._abort_queue...
r3930 if msg is None:
MinRK
use logging instead of `print >>` in pykernel
r3981 # msg=None on EAGAIN
MinRK
properly handle nothing to recv in pykernel._abort_queue...
r3930 break
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 else:
MinRK
use logging instead of `print >>` in pykernel
r3981 assert ident is not None, "Missing message part."
self.log.debug("Aborting: %s"%Message(msg))
Brian E. Granger
Fixing code to assume msg_type and msg_id are top-level....
r4230 msg_type = msg['header']['msg_type']
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 reply_type = msg_type.split('_')[0] + '_reply'
MinRK
zmq kernels now started via newapp
r3970 reply_msg = self.session.send(self.shell_socket, reply_type, {'status':'aborted'}, msg, ident=ident)
MinRK
use logging instead of `print >>` in pykernel
r3981 self.log.debug(Message(reply_msg))
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 # We need to wait a bit for requests to come in. This can probably
# be set shorter for true asynchronous clients.
time.sleep(0.1)
Fernando Perez
Added zmq kernel file which I forgot
r2598
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 def _raw_input(self, prompt, ident, parent):
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 # Flush output before making the request.
sys.stderr.flush()
sys.stdout.flush()
# Send the input request.
content = dict(prompt=prompt)
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 msg = self.session.send(self.stdin_socket, u'input_request', content, parent, ident=ident)
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730
# Await a response.
MinRK
zmq kernels now started via newapp
r3970 ident,reply = self.session.recv(self.stdin_socket, 0)
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 try:
value = reply['content']['value']
except:
MinRK
use logging instead of `print >>` in pykernel
r3981 self.log.error("Got bad raw_input reply: %s"%Message(parent))
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 value = ''
return value
epatters
* Restored functionality after major merge....
r2778 def _complete(self, msg):
return self.completer.complete(msg.content.line, msg.content.text)
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 def _object_info(self, context):
symbol, leftover = self._symbol_from_context(context)
epatters
* Adding object_info_request support to prototype kernel....
r2612 if symbol is not None and not leftover:
doc = getattr(symbol, '__doc__', '')
else:
doc = ''
object_info = dict(docstring = doc)
return object_info
epatters
Initial checkin of (not yet working) matplotlib payload backend and associated machinery.
r2756 def _symbol_from_context(self, context):
epatters
* Adding object_info_request support to prototype kernel....
r2612 if not context:
return None, context
base_symbol_string = context[0]
symbol = self.user_ns.get(base_symbol_string, None)
if symbol is None:
symbol = __builtin__.__dict__.get(base_symbol_string, None)
if symbol is None:
return None, context
context = context[1:]
for i, name in enumerate(context):
new_symbol = getattr(symbol, name, None)
if new_symbol is None:
return symbol, context[i:]
else:
symbol = new_symbol
return symbol, []
epatters
Kernel subprocess parent polling is now implemented for Windows.
r2712 #-----------------------------------------------------------------------------
# Kernel main and launch functions
#-----------------------------------------------------------------------------
MinRK
zmq kernels now started via newapp
r3970 def launch_kernel(*args, **kwargs):
""" Launches a simple Python kernel, binding to the specified ports.
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
zmq kernels now started via newapp
r3970 This function simply calls entry_point.base_launch_kernel with the right first
command to start a pykernel. See base_launch_kernel for arguments.
epatters
* Added 'independent' argument to 'launch_kernel' for setting subprocess persistence goals. The case for 'independent=False' is only partially implemented....
r2700
Returns
-------
A tuple of form:
MinRK
zmq kernels now started via newapp
r3970 (kernel_process, xrep_port, pub_port, req_port, hb_port)
epatters
* Added 'req_port' option to 'launch_kernel' and the kernel entry point....
r2702 where kernel_process is a Popen object and the ports are integers.
epatters
* Added a function for spawning a localhost kernel in a new process on random ports....
r2641 """
epatters
* Restored functionality after major merge....
r2778 return base_launch_kernel('from IPython.zmq.pykernel import main; main()',
MinRK
zmq kernels now started via newapp
r3970 *args, **kwargs)
epatters
* Added 'independent' argument to 'launch_kernel' for setting subprocess persistence goals. The case for 'independent=False' is only partially implemented....
r2700
MinRK
zmq kernels now started via newapp
r3970 def main():
"""Run a PyKernel as an application"""
MinRK
use App.instance() in kernel launchers...
r3980 app = KernelApp.instance()
MinRK
zmq kernels now started via newapp
r3970 app.initialize()
app.start()
Fernando Perez
Added zmq kernel file which I forgot
r2598
if __name__ == '__main__':
epatters
* Implemented a proper main() function for kernel.py that reads command line input....
r2667 main()