Получить текущее содержимое всего ноутбука Jupyter - PullRequest
0 голосов
/ 01 июля 2018

У меня работает ноутбук Jupyter. Я хочу иметь доступ к источнику текущей записной книжки Jupyter из Python. Моя конечная цель - передать его в ast.parse, чтобы я мог провести некоторый анализ кода пользователя. В идеале я мог бы сделать что-то вроде этого:

import ast
ast.parse(get_notebooks_code())

Очевидно, что если исходный код был файлом IPYNB, был бы промежуточный этап извлечения кода из ячеек Python, но решить эту проблему довольно просто.

Пока что я нашел код, который будет использовать функцию list_running_servers объекта IPython для того, чтобы сделать запрос и сопоставить идентификаторы ядра - это дает мне имя файла работающей в данный момент записной книжки. Это будет работать, за исключением того факта, что исходный код на диске может не совпадать с тем, что есть у пользователя в браузере (пока вы не сохраните новую контрольную точку).

Я видел некоторые идеи, связанные с извлечением данных с использованием JavaScript, но для этого требуется либо отдельная ячейка с магией, либо вызов функции display.Javascript, которая запускается асинхронно и поэтому не позволяет мне передать результат ast.parse.

У кого-нибудь есть какие-нибудь умные идеи о том, как динамически получить текущий код записной книжки, доступный в виде строки в Python для немедленной обработки? У меня все отлично, если мне нужно сделать это расширением или даже оболочкой ядра, мне просто нужно каким-то образом получить исходный код.

1 Ответ

0 голосов
/ 02 июля 2018

Ну, это не совсем то, что я хотел, но вот моя текущая стратегия. Мне нужно запустить некоторый код 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);
    }
}}});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...