是否可以保存IPython工作区(定义的函数,不同类型的变量等),以便以后加载?
这与MATLAB或R中的save.image()
类似。之前已经提出了类似的问题,例如:
Save session in IPython like in MATLAB?
然而,几年过去了,我想知道现在是否有一个好的解决方案。
答案 0 :(得分:8)
编辑:此答案(和gist)已被修改为适用于IPython 6
我添加了一个有点特别的解决方案,它使用IPython的%store magic中的底层代码自动执行存储/恢复用户空间变量的过程,这是我理解你想要的。请参阅要点here。请注意,这仅适用于可以腌制的对象。
我不能保证它的健壮性,特别是如果IPython中的任何autorestore机制在未来发生变化,但它一直在使用IPython 2.1.0。希望这至少会指出你正确的方向。
将此行添加到您的个人资料的ipython启动脚本中(例如,$ 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。
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
答案 1 :(得分:0)
你可以尝试
%save name lines
如果您输入了67个命令,并希望保存所有命令,那就好了:
%save myhistory 1-67
答案 2 :(得分:0)
虽然不如save.image()
那么方便,但您可以使用其中一个检查点/恢复应用程序。如果您使用的是Linux,则可以尝试http://criu.org。我不时使用它来转储我的ipython
状态并在以后恢复它。
为了使用CRIU转储shell应用程序,你需要找到它的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
。
答案 3 :(得分:0)
您可以使用dill python软件包:
import dill
filepath = 'session.pkl'
dill.dump_session(filepath) # Save the session
dill.load_session(filepath) # Load the session
要安装它:
pip install dill
答案 4 :(得分:-5)
你当然可以在ipython notebook 中执行此操作。
当笔记本保存时 - 手动或默认配置 - 笔记本保存为 .ipynb 文件,这只是 json 文件(github gist中的example)。
下次在该文件所在的目录中启动ipython服务器时,服务器将检测到它。
当您在浏览器中打开该笔记本时,所有代码和&配置就在那里,但未执行;您可以通过从单元格菜单中选择执行所有单元格来执行每个单元格中的代码。
此外,您可以手动保存笔记本的快照,如 ipynb_checkpoints ,它们存储在该名称前面有一个点的目录中。
最后,从文件菜单选项中,您可以将笔记本保存为纯python源文件(。 py )