You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.3 KiB
46 lines
1.3 KiB
4 years ago
|
# coding: utf-8
|
||
|
"""A lab app that runs a sub process for a demo or a test."""
|
||
|
import sys
|
||
|
|
||
|
from tornado.ioloop import IOLoop
|
||
|
from traitlets import Bool
|
||
|
|
||
|
from .server import ServerApp
|
||
|
from .handlers import add_handlers, LabConfig
|
||
|
from .process import Process
|
||
|
|
||
|
|
||
|
class ProcessApp(ServerApp):
|
||
|
"""A notebook app that runs a separate process and exits on completion."""
|
||
|
|
||
|
open_browser = Bool(False)
|
||
|
|
||
|
lab_config = LabConfig()
|
||
|
|
||
|
def get_command(self):
|
||
|
"""Get the command and kwargs to run with `Process`.
|
||
|
This is intended to be overridden.
|
||
|
"""
|
||
|
return ['python', '--version'], dict()
|
||
|
|
||
|
def start(self):
|
||
|
"""Start the application.
|
||
|
"""
|
||
|
add_handlers(self.web_app, self.lab_config)
|
||
|
IOLoop.current().add_callback(self._run_command)
|
||
|
ServerApp.start(self)
|
||
|
|
||
|
def _run_command(self):
|
||
|
command, kwargs = self.get_command()
|
||
|
kwargs.setdefault('logger', self.log)
|
||
|
future = Process(command, **kwargs).wait_async()
|
||
|
IOLoop.current().add_future(future, self._process_finished)
|
||
|
|
||
|
def _process_finished(self, future):
|
||
|
try:
|
||
|
IOLoop.current().stop()
|
||
|
sys.exit(future.result())
|
||
|
except Exception as e:
|
||
|
self.log.error(str(e))
|
||
|
sys.exit(1)
|