在IPython中保存工作区

时间:2014-09-29 18:54:32

标签: python ipython

是否可以保存IPython工作区(定义的函数,不同类型的变量等),以便以后加载?

这与MATLAB或R中的save.image()类似。之前已经提出了类似的问题,例如:

Save session in IPython like in MATLAB?

然而,几年过去了,我想知道现在是否有一个好的解决方案。

5 个答案:

答案 0 :(得分:8)

  

编辑:此答案(和gist)已被修改为适用于IPython 6

我添加了一个有点特别的解决方案,它使用IPython的%store magic中的底层代码自动执行存储/恢复用户空间变量的过程,这是我理解你想要的。请参阅要点here。请注意,这仅适用于可以腌制的对象。

我不能保证它的健壮性,特别是如果IPython中的任何autorestore机制在未来发生变化,但它一直在使用IPython 2.1.0。希望这至少会指出你正确的方向。

重申解决方案:

  1. 将下面的save_user_variables.py脚本添加到您的ipython文件夹(默认为$ HOME / .ipython)。该脚本负责在退出时保存用户变量。
  2. 将此行添加到您的个人资料的ipython启动脚本中(例如,$ HOME / .ipython / profile_default / startup / startup.py):

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

  3. 在您的ipython配置文件配置文件中(默认为$ HOME / .ipython / profile_default / ipython_config.py),找到以下行:

    # c.StoreMagics.autorestore = False

    取消注释并将其设置为true。这会在启动时自动重新加载存储的变量。或者,您可以使用%store -r。

  4. 手动重新加载上一个会话

    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
    

答案 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