Ответ 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