2015-11-21 54 views
2

我想发送一些任意数据到Jupyter Notebook前端。通过Comm发送json数据到Jupyter Notebook前端

根据http://jupyter-client.readthedocs.org/en/latest/messaging.html#opening-a-comm,Comm协议是一种发送自定义消息类型的方式,而不需要像使用execute_request msg_type那样的黑客技术。

在Python端,我有

from ipykernel.comm import Comm 
c=Comm() 
#c.open() 
#c.send(data={'foo':'bar'}) 

然而,在JavaScript端上我初始化通讯()得到一个错误:

Error: Class comm not found in registry at http://localhost:8888/static/notebook/js/main.min.js?v=40e10638fcf65fc1c057bff31d165e9d:12751:28 at Object.load_class (http://localhost:8888/static/notebook/js/main.min.js?v=40e10638fcf65fc1c057bff31d165e9d:12736:16) at CommManager.comm_open (http://localhost:8888/static/notebook/js/main.min.js?v=40e10638fcf65fc1c057bff31d165e9d:21802:37) at x.isFunction.i (http://localhost:8888/static/notebook/js/main.min.js?v=40e10638fcf65fc1c057bff31d165e9d:89:5488) at Kernel._handle_iopub_message (http://localhost:8888/static/notebook/js/main.min.js?v=40e10638fcf65fc1c057bff31d165e9d:23101:20) at Kernel._finish_ws_message (http://localhost:8888/static/notebook/js/main.min.js?v=40e10638fcf65fc1c057bff31d165e9d:22936:29) at http://localhost:8888/static/notebook/js/main.min.js?v=40e10638fcf65fc1c057bff31d165e9d:22926:44 

这个错误是什么意思?

回答

8

想通了 - IPyWidgets笔记本扩展提供了如何做到这一点很好的例子:https://github.com/ipython/ipywidgets

在JS方面:

var comm_manager=Jupyter.notebook.kernel.comm_manager 
var handle_msg=function(msg){ 
    console.log('got msg'); 
    console.log(msg) 
} 

comm_manager.register_target('myTarget', function(comm,msg){ 
    console.log('opened comm'); 
    console.log(msg); 
    // register callback 
    comm.on_msg(handle_msg) 
}) 

然后在Python,

from ipykernel.comm import Comm 
c=Comm(target_name='myTarget',data={}) 
c.send('hello') 

响应在浏览器控制台中:

opened comm 
VM4511:3 Object {parent_header: Object, msg_type: "comm_open", msg_id: "331ba915-0b45-4421-b869-7d9794d72113", content: Object, header: Object…} 
VM4464:2 got msg 
VM4464:2 Object {parent_header: Object, msg_type: "comm_msg", msg_id: "9fdc83c8-49c5-4629-aa43-7ddf92cb4f5e", content: Object, header: Object…}