Подтвердить что ты не робот

Сохранить рабочее пространство в IPython

Можно ли сохранить рабочее пространство IPython (определенные функции, различные типы переменных и т.д.), чтобы его можно было загрузить позже?

Это была бы аналогичная функция для save.image() в MATLAB или R. Аналогичные вопросы задавали раньше, например:

Сохранить сеанс в IPython, как в MATLAB?

Однако, поскольку прошло несколько лет, мне интересно, есть ли сейчас хорошее решение.

4b9b3361

Ответ 1

EDIT: этот ответ (и gist) был изменен для работы в IPython 6

Я добавил несколько ad-hoc решение, которое автоматизирует процесс хранения/восстановления переменных пространства пользователя, используя базовый код из IPython% store magic, который от того, что я понимаю, чего вы хотели. См. Gist здесь. Обратите внимание, что это работает только для объектов, которые можно мариновать.

Я не могу гарантировать его надежность, особенно если какой-либо из механизмов автозапуска в IPython изменится в будущем, но он работает для меня с IPython 2.1.0. Надеюсь, это по крайней мере укажет на вас в правильном направлении.

Чтобы повторить здесь решение:

  • Добавьте save_user_variables.py script ниже в вашу папку ipython (по умолчанию $HOME/.ipython). Этот script заботится о сохранении пользовательских переменных при выходе.
  • Добавьте эту строку в свой профиль. ipython startup script (например, $HOME/.ipython/profile_default/startup/startup.py):

    get_ipython().ex("import save_user_variables;del save_user_variables")

  • В вашем конфигурационном файле профиля ipython (по умолчанию $HOME/.ipython/profile_default/ipython_config.py) найдите следующую строку:

    # c.StoreMagics.autorestore = False

    Раскомментируйте его и установите для него значение true. Это автоматически перезагружает сохраненные переменные при запуске. В качестве альтернативы вы можете перезагрузить последний сеанс вручную, используя% store -r.

save_user_variables.py

def get_response(quest,default=None,opts=('y','n'),please=None,fmt=None):
    try:
        raw_input = input
    except NameError:
        pass
    quest += " ("
    quest += "/".join(['['+o+']' if o==default else o for o in opts])
    quest += "): "

    if default is not None: opts = list(opts)+['']
    if please is None: please = quest
    if fmt is None: fmt = lambda x: x

    rin = input(quest)
    while fmt(rin) not in opts: rin = input(please)

    return default if default is not None and rin == '' else fmt(rin)

def get_user_vars():
    """
    Get variables in user namespace (ripped directly from ipython namespace
    magic code)
    """
    import IPython
    ip = IPython.get_ipython()    
    user_ns = ip.user_ns
    user_ns_hidden = ip.user_ns_hidden
    nonmatching = object()
    var_hist = [ i for i in user_ns
                 if not i.startswith('_') \
                 and (user_ns[i] is not user_ns_hidden.get(i, nonmatching)) ]
    return var_hist

def shutdown_logger():
    """
    Prompts for saving the current session during shutdown
    """
    import IPython, pickle
    var_hist = get_user_vars()
    ip = IPython.get_ipython()
    db = ip.db

    # collect any variables that need to be deleted from db
    keys = map(lambda x: x.split('/')[1], db.keys('autorestore/*'))
    todel = set(keys).difference(ip.user_ns)
    changed = [db[k] != ip.user_ns[k.split('/')[1]]
               for k in db.keys('autorestore/*') if k.split('/')[1] in ip.user_ns]

    try:
        if len(var_hist) == 0 and len(todel) == 0 and not any(changed): return
        if get_response("Save session?", 'n', fmt=str.lower) == 'n': return
    except KeyboardInterrupt:
        return

    # Save interactive variables (ignore unsaveable ones)
    for name in var_hist:
        obj = ip.user_ns[name]
        try:
            db[ 'autorestore/' + name ] = obj
        except pickle.PicklingError:
            print("Could not store variable '%s'. Skipping..." % name)
            del db[ 'autorestore/' + name ]

    # Remove any previously stored variables that were deleted in this session
    for k in todel:
        del db['autorestore/'+k]

import atexit
atexit.register(shutdown_logger)
del atexit

Ответ 2

Вы можете попробовать

%save name lines

Как если бы у вас было 67 команд, и вы хотите сохранить их все:

%save myhistory 1-67

Ответ 3

Хотя это не так удобно, как save.image(), вы можете использовать одно из приложений контрольной точки/восстановления. Если вы используете Linux, вы можете попробовать http://criu.org. Я использую его время от времени, чтобы сбросить мое состояние ipython и восстановить его позже.

Чтобы сбрасывать приложение оболочки с CRIU, вам нужно найти его PID (например, pstree -p), а затем использовать что-то вроде этого (для этого вам понадобится второй терминал: CRIU не может сбрасывать остановленные задания)

sudo criu dump -t PID --images-dir ~/tmp/imgs --log-file dump.log -v4 --shell-job

это запишет все необходимые изображения в ~/tmp/imgs (помните опцию --shell-job). Чтобы восстановить состояние позже на текущем терминале (не забудьте нажать Enter, чтобы получить следующую подсказку ipython):

sudo criu restore --images-dir ~/tmp/imgs/ --log-file restore.log -v4 --shell-job

Проверьте журналы в случае возникновения проблем.

Очевидно, CRIU будет работать с любым приложением (с некоторыми ограничениями, конечно). Это просто идея, поэтому вы можете использовать ее для ipython.

Ответ 4

вы можете сделать это в ноутбуке ipython.

когда ноутбук сохраняется - либо вручную, либо по умолчанию - ноутбук сохраняется как файл .ipynb, который является только файлом json (пример в github gist).

В следующий раз, когда вы запустите ipython-сервер в каталоге, где находится этот файл, сервер обнаружит его.

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

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

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