首页 > 解决方案 > 如何在 Javascript 中正确使用 Jupyter notebook 的 kernel.execute 方法(时序问题)?

问题描述

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

Jupyter 前端扩展 JavaScript API 的文档在哪里?

我的草稿适用于一些例子。但是,我仍然有一些时间问题。

=> Jupyter内核的execute方法的执行顺序有bug吗?

或者这是预期的行为?如果是这样,使用执行方法的推荐方法是什么/我应该如何调整我的代码以便我的“JupyterTerminal”可以以一般方式使用?

使用我的方法执行以下 python 代码时executePythonCode,首先调用回调shell,解决我的承诺。我的调用主代码将继续执行。稍后,iopub回调被调用,给了我想要的文本内容。

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

但是,我希望iopub首先调用 the ,然后调用 the shell我希望我的调用代码等到文本被检索到。

我试图删除部分中的resolve();命令shell,以便我的承诺不会过早解决。这适用于上述文本阅读示例。

但是,当执行没有输出的代码时,Promise 永远不会被解析。因此,我似乎需要在shell回调中调用 resolve()。

关于如何使用 Jupyter notebook 内核从自定义 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);
    });     
}

}

标签: javascriptjupyter-notebook

解决方案


推荐阅读