无法从笔记本中的 Javascript 调用 Python 函数

Cannot call Python function from Javascript in Notebook

我想在 Jupyter Notebook 中调用函数 say_hello

def say_hello():
  print('hello')

%%javascript
//What have been tried
// Method 1
var kernel = IPython.notebook.kernel;
kernel.execute("say_hello()", {"output": callback});

// Method 2
Jupyter.notebook.kernel.execute("say_hello()")

两种方法都会在浏览器控制台中抛出 ReferenceError

VM5326:7 Uncaught ReferenceError: IPython is not defined
    at send_message (<anonymous>:7:22)
    at onClickSendMessage (<anonymous>:12:9)
    at HTMLButtonElement.onclick (app.ipynb:1)

版本:JupterLab 3.5,IPython7.16,Python3.9.1

您得到的 ReferenceError 是由 Jupyter 造成的,IPython 全局变量在 Jupyter 实验室中根本不可用。你必须 write a JupyterLab extension 自己。

不过,这些东西在 Jupyter Notebooks 中确实有效。您尝试的两种方法都是一个好的开始,但需要一些改进。

我们需要 3 个单元格 - Python、HTML 和 JS 一个。

  1. 让我们在Python.
  2. 中定义我们想要从JS调用的方法
def say_hello():
    print('hello')
  1. 我们需要创建一个单元格输出,JS 将在其中写入执行结果。
%%html
<div id="result_output">
  1. 我们执行Python函数,并在回调中处理执行结果。从回调中,我们将结果文本填充到我们上面创建的输出中。
%%javascript
const callbacks = {
    iopub: {
        output: (data) => {
            // this will print a message in browser console
            console.log('hello in console')

            // this will insert the execution result into "result_output" div
            document.getElementById("result_output").innerHTML = data.content.text
        }
    }
};

const kernel = Jupyter.notebook.kernel
kernel.execute('say_hello()', callbacks)

一些注意事项:

  • 如果您不需要查看结果,您的第二种方法就足够了,执行已执行,只是不处理内核的结果(您可以在 Websocket 请求的浏览器 devtools 的网络选项卡中看到消息)
  • 在你的方法 1 中你使用 callback 但你没有定义它 - 这会导致另一个 ReferenceError
  • 在 JS 中使用 constis better 比使用 var
  • Jupyter.notebook.kernelIPython.notebook.kernel
  • 相同