You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
# Copyright (c) Jupyter Development Team.
|
|
# Distributed under the terms of the Modified BSD License.
|
|
|
|
"""A lab app that runs a sub process for a demo or a test."""
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from typing import Any
|
|
|
|
from jupyter_server.extension.application import ExtensionApp, ExtensionAppJinjaMixin
|
|
from tornado.ioloop import IOLoop
|
|
|
|
from .handlers import LabConfig, add_handlers
|
|
from .process import Process
|
|
|
|
|
|
class ProcessApp(ExtensionAppJinjaMixin, LabConfig, ExtensionApp):
|
|
"""A jupyterlab app that runs a separate process and exits on completion."""
|
|
|
|
load_other_extensions = True
|
|
|
|
# Do not open a browser for process apps
|
|
open_browser = False # type:ignore[assignment]
|
|
|
|
def get_command(self) -> tuple[list[str], dict[str, Any]]:
|
|
"""Get the command and kwargs to run with `Process`.
|
|
This is intended to be overridden.
|
|
"""
|
|
return [sys.executable, "--version"], {}
|
|
|
|
def initialize_settings(self) -> None:
|
|
"""Start the application."""
|
|
IOLoop.current().add_callback(self._run_command)
|
|
|
|
def initialize_handlers(self) -> None:
|
|
"""Initialize the handlers."""
|
|
add_handlers(self.handlers, self) # type:ignore[arg-type]
|
|
|
|
def _run_command(self) -> None:
|
|
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: Any) -> None:
|
|
try:
|
|
IOLoop.current().stop()
|
|
sys.exit(future.result())
|
|
except Exception as e:
|
|
self.log.error(str(e))
|
|
sys.exit(1)
|