无法从笔记本中的 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 一个。
- 让我们在Python.
中定义我们想要从JS调用的方法
def say_hello():
print('hello')
- 我们需要创建一个单元格输出,JS 将在其中写入执行结果。
%%html
<div id="result_output">
- 我们执行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 中使用
const
is better 比使用 var
Jupyter.notebook.kernel
与 IPython.notebook.kernel
相同
我想在 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 一个。
- 让我们在Python. 中定义我们想要从JS调用的方法
def say_hello():
print('hello')
- 我们需要创建一个单元格输出,JS 将在其中写入执行结果。
%%html
<div id="result_output">
- 我们执行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 中使用
const
is better 比使用var
Jupyter.notebook.kernel
与IPython.notebook.kernel
相同