Как перезагрузить ноутбук Jupyter после перезагрузки ядра? - PullRequest
1 голос
/ 05 ноября 2019

В блокноте Jupyter я хотел бы определить функцию в Python, которая при вызове выполняет следующие действия:

  • Выдает предупреждение пользователю
  • Перезапускаетядро ноутбука
  • Помечает выполненную ячейку как выполненную (т. е. без звезды, [ ])
  • Фокус находится на следующей ячейке

Или как альтернатива:

  • Выдает предупреждение пользователю
  • Перезапускает ядро ​​ноутбука
  • Очищает все выходные данные всего ноутбука
  • Фокус наснова первая ячейка (как перезагрузка F5 вкладки браузера).

Я пробовал следующий код

from IPython.display import display, HTML

def reload():
    display(HTML(
        '''
            <script>
                alert('This notebook needs to be restarted!');

                IPython.notebook.kernel.restart(); 
                IPython.display.clear_output();

                window.location.reload();

            </script>            
        '''
    ))
reload()

, но он выдает ошибку

AttributeError: 'function' object has no attribute 'clear_output'

несмотря на эту документацию .

Когда я удаляю строку

IPython.display.clear_output();

, тогда ядро ​​перезапускается, но я получаю 2 (!) Предупреждения, и похоже, что выполняется следующая ячейка. Кроме того, ячейки не очищаются, текущая ячейка все еще имеет звездочку в скобках ([*]).

Как это сделать правильно?

Ответы [ 2 ]

1 голос
/ 12 ноября 2019

Этот код выполняет то, что вы описали как альтернативный вариант, с добавлением сохранения контрольной точки перед перезагрузкой, чтобы выходные данные оставались очищенными:

from IPython.display import Javascript, display


def reload():
    display(
        Javascript('''
            // clear all output (based on: https://stackoverflow.com/a/47315713/9504155)           
            // save a reference to the cell we're currently executing inside of,
            // to avoid clearing it later (which would remove this js)
            var this_cell = $(element).closest('.cell').data('cell');
            function clear_other_cells () {
                Jupyter.notebook.get_cells().forEach(function (cell) {
                    if (cell.cell_type === 'code' && cell !== this_cell) {
                        cell.clear_output();
                    }
                    Jupyter.notebook.set_dirty(true);
                });
            }

            if (Jupyter.notebook._fully_loaded) {
                // notebook has already been fully loaded, so clear now
                clear_other_cells();
            }

            // save checkpoint so output stays cleared after reload
            IPython.notebook.save_checkpoint();

            IPython.notebook.kernel.restart();

            alert('This notebook needs to be restarted!');
            window.location.reload(false);
        '''))

reload()

Если вы предпочитаете первый вариант (без перезагрузки страницы,вместо этого сосредоточив внимание на следующей ячейке), просто удалите строки для сохранения контрольной точки и перезагрузки и используйте функцию IPython.display.clear_output() после части JavaScript, чтобы очистить также вывод текущей ячейки:

from IPython.display import Javascript, clear_output, display


def reload():
    display(
        Javascript('''
            // clear all output (based on: https://stackoverflow.com/a/47315713/9504155)           
            // save a reference to the cell we're currently executing inside of,
            // to avoid clearing it later (which would remove this js)
            var this_cell = $(element).closest('.cell').data('cell');
            function clear_other_cells () {
                Jupyter.notebook.get_cells().forEach(function (cell) {
                    if (cell.cell_type === 'code' && cell !== this_cell) {
                        cell.clear_output();
                    }
                    Jupyter.notebook.set_dirty(true);
                });
            }

            if (Jupyter.notebook._fully_loaded) {
                // notebook has already been fully loaded, so clear now
                clear_other_cells();
            }

            IPython.notebook.kernel.restart();

            alert('Notebook output cleared!');
        '''))
    clear_output()

IPython.display.clear_output(); былоне работает в вашем коде, потому что он вызывается в теге HTML <script> как код JavaScript, а не в Python.

0 голосов
/ 05 ноября 2019

Я не уверен в других проблемах, с которыми вы столкнулись, но код

IPython.display.clear_output();

успешно прошел без проблем в моей записной книжке jupyter, вы уверены, что версия вашей записной книжки jupyter актуальна илиотличается от версии в документации ? Неудивительно, что разные версии могут иметь разные имена функций или даже вся структура может отличаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...