javascript - 如何在 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);
});
}
}