示例#1
0
class PythonProvider:
    def __init__(self):
        self.mk_manager = MultiKernelManager()

    def start(self, user_id):
        """
        Runs jupyter kernel in new container
        """
        self.mk_manager.start_kernel(kernel_id=user_id)

    def restart(self, user_id):
        """
        Restarts jupyter kernel
        """
        self.mk_manager.shutdown_kernel(user_id)
        self.start(user_id)

    def get_client_by(self, user_id):
        """
        Get client connected to kernel
        """
        try:
            kernel_manager = self.mk_manager.get_kernel(user_id)
        except KeyError:
            self.start(user_id)
            kernel_manager = self.mk_manager.get_kernel(user_id)
        return kernel_manager.client()

    def execute(self, user_id, command):
        """
        Executes command for custom user
        If connections was closed  returns None,
        else returns command result
        """
        if not all((user_id, command)):
            return None

        client = self.get_client_by(user_id)
        client.execute(command)

        output = ''
        while True:
            msg = client.get_iopub_msg()

            if msg['msg_type'] == 'execute_result':
                output += msg['content']['data']['text/plain']
            elif msg['msg_type'] == 'stream':
                output += msg['content']['text']
            elif msg['msg_type'] == 'error':
                output += '\n'.join(msg['content']['traceback'])
            elif msg.get('content', {}).get('execution_state') == 'idle':
                break

        return output