获取整个Jupyter Notebook的当前内容

时间:2018-07-01 08:29:08

标签: python jupyter-notebook

我正在运行Jupyter Notebook。我希望能够从Python中访问当前Jupyter Notebook的源代码。我的最终目标是将其传递到ast.parse中,以便我可以对用户的代码进行一些分析。理想情况下,我可以执行以下操作:

import ast
ast.parse(get_notebooks_code())

很明显,如果源代码是IPYNB文件,则有一个中间步骤可以从Python单元中提取代码,但这是一个相对容易解决的问题。

到目前为止,我已经找到了将使用IPython对象的list_running_servers函数以便发出请求并匹配内核ID的代码-这为我提供了当前正在运行的笔记本的文件名。除磁盘上的源代码可能与用户在浏览器中的内容不匹配(直到您保存新的检查点)外,这将起作用。

我已经看到一些想法,涉及使用JavaScript提取数据,但这需要使用魔术单独的单元格或调用display.Javascript函数-异步触发,因此不允许将结果传递给{ {1}}。

对于如何动态地将当前笔记本的源代码作为字符串以Python中的形式进行即时处理,有人有任何聪明的主意吗?如果我需要将其作为扩展或者甚至是内核包装程序,那我就很好,我只需要以某种方式获取源代码即可。

1 个答案:

答案 0 :(得分:1)

嗯,这并不是我想要的,但这是我目前的策略。我需要根据用户代码运行一些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);
    }
}}});
相关问题