Как подготовить или сохранить сеанс записной книжки Jupyter (IPython) на будущее

104

Скажем, я выполняю более крупный анализ данных в блокноте Jupyter / Ipython с большим количеством трудоемких вычислений. Затем по какой-то причине мне нужно выключить локальный сервер jupyter I, но я хотел бы вернуться к анализу позже, без необходимости повторять все трудоемкие вычисления снова.


Что бы я хотел бы сделать это pickleили хранить всю сессию Jupyter (все панда dataframes, np.arrays, переменные, ...) , поэтому я могу спокойно выключить сервер , зная , что я могу вернуться к моей сессии в точно таком же состоянии , как перед.

Возможно ли это вообще технически? Есть ли встроенная функция, которую я упустил?


РЕДАКТИРОВАТЬ: на основе этого ответа есть %store магия, которая должна быть «легким рассолом». Однако вам нужно сохранить переменные вручную следующим образом:

#inside a ipython/nb session
foo = "A dummy string"
%store foo
закрытие экрана, перезапуск ядра
%store -r foo # r для обновления
print(foo) # "A dummy string"

что довольно близко к тому, что я хотел бы, но необходимость делать это вручную и невозможность различать разные сеансы делает его менее полезным.

Робин Немет
источник
1
Есть ли в этом прогресс? Я только заметил, что в Spyder IDE есть рабочая область, которая может сохранять переменные в * .mat. Но не уверен, можно ли это перенести в Jupyter Notebook.
cqcn1991 06
Вы рассматривали pypi.python.org/pypi/dill ? «dill также предоставляет возможность: - сохранять и загружать сеансы интерпретатора python» Это питон, хотя не уверен, что еще связано с ipython или ядром
piccolbo

Ответы:

66

Думаю, Дилл хорошо отвечает на ваш вопрос.

pip install dill

Сохраните сеанс записной книжки:

import dill
dill.dump_session('notebook_env.db')

Восстановить сеанс записной книжки:

import dill
dill.load_session('notebook_env.db')

Источник

МеталлойД
источник
1
терпит неудачу, когда есть генераторы (что имеет смысл, когда я думаю об этом), но кажется, что это так близко, на что мы можем надеяться!
Робин Немет
1
Отлично сработал для меня. Следует иметь в виду пару вещей: во-первых, если у вас есть объекты подключения pyodbc, вам нужно закрыть их, а затем установить для всех значение None, иначе вы получите ошибку «TypeError: не удается обработать объекты pyodbc.Connection». . Во-вторых, состояние записной книжки не включает графики, которые были созданы вашим кодом, поэтому вам нужно повторно запустить ячейки, чтобы вернуть их.
Michael Szczepaniak
Но это не работает. Я использовал сохраненный файл на другом компьютере
Джая А.
Установлен укроп. Могу ли я импортировать укроп dill.dump_session ('notebook_env.db') из командной строки?
cheznead
Нет, вам нужно будет сделать это во время работы ноутбука Jupyter. И dump_session, и load_session должны проходить через записную книжку. Ваша load_session может быть в начале записной книжки. А dump_session может быть в самом конце записной книжки.
MetalloyD
28

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

Вы можете систематически хранить большинство переменных, подобных данным. Обычно я храню все фреймы данных, массивы и т. Д. В pandas.HDFStore . В начале записной книжки объявите

backup = pd.HDFStore('backup.h5')

а затем сохраните любые новые переменные по мере их создания

backup['var1'] = var1

В конце, наверное, неплохо было бы сделать

backup.close()

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

backup = pd.HDFStore('backup.h5')
var1 = backup['var1']

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

Anh Huynh
источник
6
Это очень интересный обходной путь, но я буквально чувствую боль, связанную с поддержанием такой системы. Спасибо за совет :)
Робин Немет
19

Этот вопрос связан с: Как кэшировать в IPython Notebook?

Чтобы сохранить результаты отдельных ячеек, пригодится магия кеширования .

%%cache longcalc.pkl var1 var2 var3
var1 = longcalculation()
....

При повторном запуске записной книжки содержимое этой ячейки загружается из кеша.

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

Магия кэш не может сохранить состояние целого ноутбука еще . Насколько мне известно, другой системы для возобновления «записной книжки» пока нет. Для этого потребуется сохранить всю историю ядра Python. После загрузки ноутбука и подключения к ядру эта информация должна быть загружена.

Васко
источник