Как программно удалить ячейку ввода Jupyter Notebook, используя ее тег? - PullRequest
0 голосов
/ 26 мая 2020

В нашей самой большой записной книжке конвейера моделирования машинного обучения нам нужно удалить одну ячейку ввода (кода) (содержащую конфиденциальную информацию, которую мы не можем передать другими способами при автоматизации ее выполнения).

Ячейка была создана (внедрена) papermill.execute_notebook(), выполненной в другом ноутбуке (контроллере), и была автоматически помечена тегом injected-parameters.

Решение (возможно, не единственное?) - это удаление ячейки сразу после ее выполнения.

Если поиск тега усложняет задачу, давайте воспользуемся решениями для простого удаления предыдущая ячейка ввода (программно).

Что не сработало

Скрытие ячейки ввода недостаточно хорошо, так как она все равно будет сохранены на диск (включая параметр report_only в execute_notebook() бумажной фабрики). Кроме того, «преобразование» с nbconvert в HTML (что позволяет выбирать ячейки для удаления на основе их тегов, как в это решение) все равно сохранит исходный блокнот с закодированным паролем внутри .

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Я предполагаю, что вы хотите удалить ячейку, потому что она содержит конфиденциальную информацию (пароль).

Мой первый совет - не передавать конфиденциальную информацию в виде обычного текста. (Немного) лучший и простой вариант - сохранить пароль в переменной среды и прочитать его из записной книжки, используя os.environ.

Вот как удалить ячейку:

Примечание : Я написал этот код на лету и не тестировал его, могут потребоваться небольшие правки.

import nbformat

nb = nbformat.read('/path/to/your/notebook.ipynb')

index = None

# find index for the cell with the injected params
for i, c in enumerate(nb.cells):
    cell_tags = c.metadata.get('tags')
    if cell_tags:
        if 'injected-parameters' in cell_tags:
            index = i

# remove cell
if index is not None:
    nb.cells.pop(index)

# save modified notebook
nbformat.write(nb,  '/path/to/your/notebook.ipynb')
0 голосов
/ 26 мая 2020

Кажется, что ответ включает nbformat, и он уже существует на этом сайте, но на вопрос, заданный на таком техническом языке, я думаю, что стоит упростить этот вопрос до моей простой английской версии sh, чтобы помочь / позволить другим узнать об этом (я должным образом проголосовал за другой ответ).

def perform_post_exec_cleanup(output_nb_name, tag_to_del='injected-parameters'):

    import json
    from traitlets.config import Config
    from nbconvert import NotebookExporter
    import nbformat

    c = Config()
    c.TagRemovePreprocessor.enabled=True # to enable the preprocessor
    c.TagRemovePreprocessor.remove_cell_tags = [tag_to_del]
    c.preprocessors = ['TagRemovePreprocessor'] # previously: c.NotebookExporter.preprocessors

    nb_body, resources = NotebookExporter(config=c).from_filename(output_nb_name)
    nbformat.write(nbformat.from_dict(json.loads(nb_body)), output_nb_name, 4)

Предостережения

Обычно такие преобразования записной книжки / удаление ячеек можно выполнить на месте в том же ноутбуке, в котором выполняется код удаления. НЕ в случае papermill - он НЕ будет работать из выходного блокнота, когда выполнение его кода контролируется с помощью функции papermill execute_notebook(). Он должен запускаться на внешнем (контроллере) ноутбуке после того, как функция завершила или прервала свое выполнение. Поскольку выходная записная книжка была постепенно сохранена на диск во время процесса, если вы хотите убедиться, что ячейка injected-parameters не сохраняется постоянно, вам необходимо безоговорочно запустить приведенный выше код очистки, даже если функция бумажной фабрики не работает, поэтому поместите его в свой finally раздел try-except-finally.

[на основе: Запустите препроцессор, используя nbconvert в качестве библиотеки ]

...