如何在Javascript中正确使用Jupyter Notebook的kernel.execute方法(计时问题)?

时间:2019-04-24 11:22:48

标签: javascript jupyter-notebook

以下是使用Jupyter笔记本的Python内核从自定义JavaScript客户端执行Python代码的草案,这是一个相关的问题:

Where is a docs for Jupyter front-end extensions JavaScript API?

我的草案适用于某些示例。但是,我仍然有一些计时问题。

执行以下python代码首先调用shell回调方法,从而实现了我的承诺。我的调用代码继续执行。稍后,将调用iopub回调,为我提供文本内容。

file = open("D:/forecast4/trunk/databases/Demo/template.xml", "r")
print(file.read())

我希望首先调用iopub,然后再调用shell。我希望我的调用代码能等到检索到文本为止。

我试图删除shell部分中的resolve();命令,以使我的诺言不会为时过早。这适用于上面的文本阅读示例。

但是,当执行不带输出的代码时,Promise永远不会被解决。因此,我似乎需要在shell回调中解决该问题。

=> Jupyter内核的execute方法的执行顺序中是否存在错误?

这是预期的行为吗?如果是这样,推荐使用execute方法的方式是什么/如何修改我的代码,以便可以以一般方式使用“ JupyterTerminal”?

关于如何使用Jupyter笔记本内核从自定义JavaScript客户端执行Python代码的示例(仍然存在一些计时问题):

export default class JupyterTerminal {

constructor(jupyter){           
    this.__kernel = jupyter.notebook.kernel;
}

 async executePythonCode(pythonCode){

    var self=this;

    return new Promise(function(resolve, reject) {  

        var isResolved=false;

        var callbacks = {
                shell : {
                        reply : (data)=>{
                            var content = data.content
                            switch(content.status){
                                case 'ok':          
                                    isResolved=true;            
                                    resolve();
                                    break;
                                case 'error':
                                    reject(content.evalue)
                                    break;
                                default:
                                    throw new Error('Not yet implemented content status "' + content.status + '"');
                            }

                        },
                },
                iopub : {
                         output : (data)=>{                              
                            var content = data.content;
                            switch(content.name){
                                case 'stderr':      
                                    if(isResolved){
                                        var message = 'Could not handle strr output while executing Python code '
                                                    +'because Promise already has been resolved:\n' + content.text;
                                        console.error(message);
                                    }                                   
                                    reject(content.text);
                                    break;
                                case 'stdout':
                                    if(isResolved){
                                        var message = 'Could not handle stout output while executing Python code '
                                                    +'because Promise already has been resolved:\n' + content.text;
                                        console.error(message);
                                    }   
                                    resolve(content.text);                                                                          
                                    break;                                          
                                case undefined:
                                    reject(content.ename + ': ' + content.evalue);  
                                    break;                                                                  
                                default:
                                    throw new Error('Not yet implemented content type "' + content.name + '"');
                            }
                         }
                }
        };                

        self.__kernel.execute(pythonCode, callbacks);
    });     
}

}

0 个答案:

没有答案