【问题标题】:How do I interact a JupyterLab extension with Python kernel?如何将 JupyterLab 扩展与 Python 内核交互?
【发布时间】:2019-11-10 22:48:04
【问题描述】:

有没有办法为 Jupyter Lab 创建一个扩展,我可以通过笔记本中的 Python 单元进行操作?

在 Jupyter Notebook 中,这可以通过具有 Python 后端和 Javascript 前端的 IPywidget 来实现。这两者可以交互,因此我可以通过 Python 向 javascript 前端发送指令,反之亦然。

据我了解,这在 Jupyter Lab 中不再可能,因为他们禁用了通过 IPython 执行 javascript 的功能。建议创建 jupyterlab 扩展。是否可以通过 Python 代码控制这样的扩展,如果可以,如何控制?

在一个简单的例子中,我想要一个侧边栏(如 TOC 扩展),其中包含一个文本框,我可以通过 Python 设置其文本。

【问题讨论】:

    标签: python jupyter-notebook jupyter jupyter-lab ipywidgets


    【解决方案1】:

    A. Python 到 JavaScript

    看看https://opensourcelibs.com/lib/ipylab

    “从 Python 笔记本控制 JupyterLab。”

    from ipylab import JupyterFrontEnd
    app = JupyterFrontEnd()
    ...
    

    在某些情况下,可能的解决方法是使用 javascript 扩展来观察 python 单元,如果 python 代码发生更改,请检查扩展是否需要相应地进行调整。

    相关:

    How to use events in jupyterlab extensions?

    B. JavaScript 到 Python

    “ConsolePanel 和 NotebookPanel 现在公开了一个 sessionContext: ISessionContext 属性,该属性允许以统一的方式与内核会话进行交互。” 来源:https://jupyterlab.readthedocs.io/en/stable/extension/extension_migration.html?highlight=migration#using-session-and-sessioncontext-to-manage-kernel-sessions

    这是一个关于内核消息传递的示例:

    https://github.com/jupyterlab/extension-examples/tree/master/kernel-messaging

    var notebookPanel = this.__getFirstVisibleNotebookPanel(app);   
    var sessionContext = notebookPanel.sessionContext;
    var kernelConnection = sessionContext.session.kernel;
    var future = kernelConnection.requestExecute('1+3');
    future.onIOPub  = (msg) => {
        const msgType = msg.header.msg_type;
        switch (msgType) {
          case 'execute_result':
          case 'display_data':
          case 'update_display_data':
            var result = msg.content;
            console.log(result);       
            break;
          default:
            break;
        }
        return;
      };
    

    【讨论】:

    • 有没有办法把它包装成一个函数并在函数执行时返回结果
    • 是的,你可以将它包装在一个承诺中。另请参见此处的异步方法 executePythonCode(pythonCode, isExpectingOutput):github.com/stefaneidelloth/treezjs/blob/master/…
    • 我最关心的是在调用函数时返回结果。我可以深入了解它。不管是 JavaScript 新手,对异步和承诺知之甚少。谢谢
    • @Stefan 非常感谢它完美运行 :)
    猜你喜欢
    • 2014-07-16
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多