无法从 Notebook 中的 Javascript 调用 Python 函数

如何解决无法从 Notebook 中的 Javascript 调用 Python 函数

我想在 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、IPython 7.16、Python 3.9.1

解决方法

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

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

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

  1. 让我们定义我们想要在 Python 中从 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 请求消息的浏览器开发工具的网络选项卡中看到)
  • 在你的方法 1 中你使用了 callback 但你没有定义它 - 这会导致另一个 ReferenceError
  • 在 JS 中使用 const is better 而不是使用 var
  • Jupyter.notebook.kernelIPython.notebook.kernel
  • 相同

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?