我有一个正在运行的 Jupyter Notebook。我希望能够从 Python 中访问当前 Jupyter Notebook 的源代码。我的最终目标是将其传递到ast.parse
这样我就可以对用户的代码进行一些分析。理想情况下,我能够做这样的事情:
import ast
ast.parse(get_notebooks_code())
显然,如果源代码是 IPYNB 文件,则需要一个从 Python 单元中提取代码的中间步骤,但这是一个相对容易解决的问题。
到目前为止,我已经找到了将使用list_running_servers
IPython 对象的函数,以便发出请求并匹配内核 ID - 这给我当前运行的笔记本的文件名。这是可行的,除了磁盘上的源代码可能与用户浏览器中的源代码不匹配(直到您保存新的检查点)。
我已经看到了一些涉及使用 JavaScript 提取数据的想法,但这需要一个带有魔法的单独单元格或调用 display.Javascript 函数 - 该函数异步触发,因此不允许我将结果传递给ast.parse
.
对于如何动态获取当前笔记本源代码作为 Python 中的字符串以便立即处理,有人有什么聪明的想法吗?如果我需要将其作为扩展甚至内核包装器,我完全没问题,我只需要以某种方式获取源代码即可。
嗯,这并不完全是我想要的,但这是我当前的策略。我需要根据用户的代码运行一些Python代码,但它实际上不必直接连接到用户的代码。所以我接下来要运行以下魔法:
%%javascript
// Get source code from cells
var source_code = Jupyter.notebook.get_cells().map(function(cell) {
if (cell.cell_type == "code") {
var source = cell.code_mirror.getValue();
if (!source.startsWith("%%javascript")) {
return source;
}
}
}).join("\n");
// Embed the code as a Python string literal.
source_code = JSON.stringify(source_code);
var instructor_code = "student_code="+source_code;
instructor_code += "\nimport ast\nprint(ast.dump(ast.parse(student_code)))\nprint('Great')"
// Run the Python code along with additional code I wanted.
var kernel = IPython.notebook.kernel;
var t = kernel.execute(instructor_code, { 'iopub' : {'output' : function(x) {
if (x.msg_type == "error") {
console.error(x.content);
element.text(x.content.ename+": "+x.content.evalue+"\n"+x.content.traceback.join("\n"))
} else {
element.html(x.content.text.replace(/\n/g, "<br>"));
console.log(x);
}
}}});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)