如何使 JupyterLab 扩展与 Python 内核交互?

Nul*_*tie 7 python jupyter jupyter-notebook ipywidgets jupyter-lab

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

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

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

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

Ste*_*fan 4

A.Python 到 JavaScript

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

“从 Python 笔记本控制 JupyterLab。”

from ipylab import JupyterFrontEnd
app = JupyterFrontEnd()
...
Run Code Online (Sandbox Code Playgroud)

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

有关的:

如何在 jupyterlab 扩展中使用事件?

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;
  };
Run Code Online (Sandbox Code Playgroud)