以下是使用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);
});
}
}