##// END OF EJS Templates
Merge branch 'htmlnotebook' of github.com:ipython/ipython into htmlnotebook...
Merge branch 'htmlnotebook' of github.com:ipython/ipython into htmlnotebook Conflicts: setupbase.py

File last commit:

r4484:65666c0b
r4485:d77eb2c8 merge
Show More
notebookapp.py
269 lines | 9.9 KiB | text/x-python | PythonLexer
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 """A tornado based IPython notebook server."""
#-----------------------------------------------------------------------------
Brian E. Granger
Updating the notebook to work with the latex master....
r4348 # Copyright (C) 2011 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING.txt, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 # Imports
#-----------------------------------------------------------------------------
Brian E. Granger
Creating files to new notebook app.
r4339 import logging
import os
Brian E. Granger
Notebook app debugging....
r4345 import signal
import sys
Brian E. Granger
Creating files to new notebook app.
r4339
import zmq
# Install the pyzmq ioloop. This has to be done before anything else from
# tornado is imported.
from zmq.eventloop import ioloop
import tornado.ioloop
tornado.ioloop = ioloop
from tornado import httpserver
from tornado import web
Brian E. Granger
Massive work on the notebook document format....
r4484 from .kernelmanager import KernelManager
from .sessionmanager import SessionManager
from .handlers import (
MainHandler, NamedNotebookHandler,
KernelHandler, KernelActionHandler, ZMQStreamHandler,
Brian E. Granger
Fixing import statments in handlers and notebookapp.
r4340 NotebookRootHandler, NotebookHandler
)
Brian E. Granger
Massive work on the notebook document format....
r4484 from .routers import IOPubStreamRouter, ShellStreamRouter
from .notebookmanager import NotebookManager
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 from IPython.core.application import BaseIPythonApplication
Brian E. Granger
Notebook app debugging....
r4345 from IPython.core.profiledir import ProfileDir
from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 from IPython.zmq.session import Session
Brian E. Granger
Notebook app debugging....
r4345 from IPython.zmq.zmqshell import ZMQInteractiveShell
from IPython.zmq.ipkernel import (
flags as ipkernel_flags,
aliases as ipkernel_aliases,
IPKernelApp
)
from IPython.utils.traitlets import Dict, Unicode, Int, Any, List, Enum
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
#-----------------------------------------------------------------------------
# Module globals
#-----------------------------------------------------------------------------
Brian E. Granger
Creating files to new notebook app.
r4339
_kernel_id_regex = r"(?P<kernel_id>\w+-\w+-\w+-\w+-\w+)"
_kernel_action_regex = r"(?P<action>restart|interrupt)"
Brian E. Granger
Massive work on the notebook document format....
r4484 _notebook_id_regex = r"(?P<notebook_id>\w+-\w+-\w+-\w+-\w+)"
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
Notebook app debugging....
r4345 LOCALHOST = '127.0.0.1'
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 #-----------------------------------------------------------------------------
# The Tornado web application
#-----------------------------------------------------------------------------
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
Renaming NotebookApplication to NotebookWebApplication.
r4342 class NotebookWebApplication(web.Application):
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
More work on updating the notebook zmq forwarding.
r4347 def __init__(self, kernel_manager, log, kernel_argv, config):
Brian E. Granger
Creating files to new notebook app.
r4339 handlers = [
(r"/", MainHandler),
Brian E. Granger
Massive work on the notebook document format....
r4484 (r"/%s" % _notebook_id_regex, NamedNotebookHandler),
Brian E. Granger
Creating files to new notebook app.
r4339 (r"/kernels", KernelHandler),
(r"/kernels/%s/%s" % (_kernel_id_regex, _kernel_action_regex), KernelActionHandler),
(r"/kernels/%s/iopub" % _kernel_id_regex, ZMQStreamHandler, dict(stream_name='iopub')),
(r"/kernels/%s/shell" % _kernel_id_regex, ZMQStreamHandler, dict(stream_name='shell')),
(r"/notebooks", NotebookRootHandler),
Brian E. Granger
Massive work on the notebook document format....
r4484 (r"/notebooks/%s" % _notebook_id_regex, NotebookHandler)
Brian E. Granger
Creating files to new notebook app.
r4339 ]
settings = dict(
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
)
web.Application.__init__(self, handlers, **settings)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 self.kernel_manager = kernel_manager
self.log = log
Brian E. Granger
Notebook app debugging....
r4345 self.kernel_argv = kernel_argv
Brian E. Granger
More work on updating the notebook zmq forwarding.
r4347 self.config = config
Brian E. Granger
Creating files to new notebook app.
r4339 self._routers = {}
Brian E. Granger
Notebook app debugging....
r4345 self._session_dict = {}
Brian E. Granger
Massive work on the notebook document format....
r4484 self.notebook_manager = NotebookManager(config=self.config)
Brian E. Granger
Creating files to new notebook app.
r4339
#-------------------------------------------------------------------------
# Methods for managing kernels and sessions
#-------------------------------------------------------------------------
@property
def kernel_ids(self):
return self.kernel_manager.kernel_ids
def start_kernel(self):
Brian E. Granger
Notebook app debugging....
r4345 kwargs = dict()
kwargs['extra_arguments'] = self.kernel_argv
kernel_id = self.kernel_manager.start_kernel(**kwargs)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 self.log.info("Kernel started: %s" % kernel_id)
Brian E. Granger
Notebook app debugging....
r4345 self.log.debug("Kernel args: %r" % kwargs)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 self.start_session_manager(kernel_id)
Brian E. Granger
Creating files to new notebook app.
r4339 return kernel_id
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 def start_session_manager(self, kernel_id):
sm = self.kernel_manager.create_session_manager(kernel_id)
self._session_dict[kernel_id] = sm
iopub_stream = sm.get_iopub_stream()
shell_stream = sm.get_shell_stream()
Brian E. Granger
More work on updating the notebook zmq forwarding.
r4347 iopub_router = IOPubStreamRouter(
zmq_stream=iopub_stream, session=sm.session, config=self.config
)
shell_router = ShellStreamRouter(
zmq_stream=shell_stream, session=sm.session, config=self.config
)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 self._routers[(kernel_id, 'iopub')] = iopub_router
self._routers[(kernel_id, 'shell')] = shell_router
def kill_kernel(self, kernel_id):
sm = self._session_dict.pop(kernel_id)
sm.stop()
self.kernel_manager.kill_kernel(kernel_id)
self.log.info("Kernel killed: %s" % kernel_id)
Brian E. Granger
Creating files to new notebook app.
r4339 def interrupt_kernel(self, kernel_id):
self.kernel_manager.interrupt_kernel(kernel_id)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 self.log.debug("Kernel interrupted: %s" % kernel_id)
Brian E. Granger
Creating files to new notebook app.
r4339
def restart_kernel(self, kernel_id):
# Create the new kernel first so we can move the clients over.
new_kernel_id = self.start_kernel()
# Copy the clients over to the new routers.
old_iopub_router = self.get_router(kernel_id, 'iopub')
old_shell_router = self.get_router(kernel_id, 'shell')
new_iopub_router = self.get_router(new_kernel_id, 'iopub')
new_shell_router = self.get_router(new_kernel_id, 'shell')
new_iopub_router.copy_clients(old_iopub_router)
new_shell_router.copy_clients(old_shell_router)
# Now shutdown the old session and the kernel.
# TODO: This causes a hard crash in ZMQStream.close, which sets
# self.socket to None to hastily. We will need to fix this in PyZMQ
# itself. For now, we just leave the old kernel running :(
Brian E. Granger
Actually kill old kernels upon restart.
r4354 # Maybe this is fixed now, but nothing was changed really.
self.kill_kernel(kernel_id)
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 self.log.debug("Kernel restarted: %s -> %s" % (kernel_id, new_kernel_id))
Brian E. Granger
Creating files to new notebook app.
r4339 return new_kernel_id
def get_router(self, kernel_id, stream_name):
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 router = self._routers[(kernel_id, stream_name)]
Brian E. Granger
Creating files to new notebook app.
r4339 return router
Brian E. Granger
Work to adapt routers to new Session message protocol.
r4346
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 #-----------------------------------------------------------------------------
# Aliases and Flags
#-----------------------------------------------------------------------------
flags = dict(ipkernel_flags)
# the flags that are specific to the frontend
# these must be scrubbed before being passed to the kernel,
# or it will raise an error on unrecognized flags
notebook_flags = []
aliases = dict(ipkernel_aliases)
aliases.update(dict(
ip = 'IPythonNotebookApp.ip',
Brian E. Granger
Notebook app debugging....
r4345 port = 'IPythonNotebookApp.port',
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 colors = 'ZMQInteractiveShell.colors',
Brian E. Granger
Notebook app debugging....
r4345 editor = 'RichIPythonWidget.editor',
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 ))
#-----------------------------------------------------------------------------
# IPythonNotebookApp
#-----------------------------------------------------------------------------
class IPythonNotebookApp(BaseIPythonApplication):
name = 'ipython-notebook'
default_config_file_name='ipython_notebook_config.py'
description = """
The IPython HTML Notebook.
This launches a Tornado based HTML Notebook Server that serves up an
HTML5/Javascript Notebook client.
"""
classes = [IPKernelApp, ZMQInteractiveShell, ProfileDir, Session,
Brian E. Granger
Notebook app debugging....
r4345 KernelManager, SessionManager, RichIPythonWidget]
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 flags = Dict(flags)
aliases = Dict(aliases)
kernel_argv = List(Unicode)
Brian E. Granger
Notebook app debugging....
r4345 log_level = Enum((0,10,20,30,40,50,'DEBUG','INFO','WARN','ERROR','CRITICAL'),
default_value=logging.INFO,
config=True,
help="Set the log level by value or name.")
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 # connection info:
ip = Unicode(LOCALHOST, config=True,
help="The IP address the notebook server will listen on."
)
port = Int(8888, config=True,
help="The port the notebook server will listen on."
)
# the factory for creating a widget
widget_factory = Any(RichIPythonWidget)
def parse_command_line(self, argv=None):
super(IPythonNotebookApp, self).parse_command_line(argv)
if argv is None:
argv = sys.argv[1:]
self.kernel_argv = list(argv) # copy
# kernel should inherit default config file from frontend
Brian E. Granger
Notebook app debugging....
r4345 self.kernel_argv.append("--KernelApp.parent_appname='%s'"%self.name)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 # scrub frontend-specific flags
for a in argv:
Brian E. Granger
Notebook app debugging....
r4345 if a.startswith('-') and a.lstrip('-') in notebook_flags:
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 self.kernel_argv.remove(a)
def init_kernel_manager(self):
# Don't let Qt or ZMQ swallow KeyboardInterupts.
signal.signal(signal.SIGINT, signal.SIG_DFL)
# Create a KernelManager and start a kernel.
self.kernel_manager = KernelManager(config=self.config, log=self.log)
Brian E. Granger
Notebook app debugging....
r4345 def init_logging(self):
super(IPythonNotebookApp, self).init_logging()
# This prevents double log messages because tornado use a root logger that
# self.log is a child of. The logging module dipatches log messages to a log
# and all of its ancenstors until propagate is set to False.
self.log.propagate = False
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 def initialize(self, argv=None):
super(IPythonNotebookApp, self).initialize(argv)
Brian E. Granger
Notebook app debugging....
r4345 self.init_kernel_manager()
Brian E. Granger
More work on updating the notebook zmq forwarding.
r4347 self.web_app = NotebookWebApplication(
self.kernel_manager, self.log, self.kernel_argv, self.config
)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 self.http_server = httpserver.HTTPServer(self.web_app)
self.http_server.listen(self.port)
def start(self):
self.log.info("The IPython Notebook is running at: http://%s:%i" % (self.ip, self.port))
ioloop.IOLoop.instance().start()
#-----------------------------------------------------------------------------
# Main entry point
#-----------------------------------------------------------------------------
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
Initial reorg of files complete....
r4341 def launch_new_instance():
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 app = IPythonNotebookApp()
app.initialize()
app.start()
Brian E. Granger
Creating files to new notebook app.
r4339