IPython笔记本:定义一个虚拟单元格魔术,只需像往常一样运行单元格

时间:2015-10-03 02:04:41

标签: ipython-notebook ipython-parallel ipython-magic

如何定义一个只执行单元格的简单单元格魔术,好像%%mymagic不在那里?

背景是我们正在使用精彩的IPython parallel框架。在某些地方,我们也使用其定义的%%px魔法。但有时我们想要在没有集群的情况下运行相同的笔记本电脑(仅限本地)。在这种情况下,%%px尚未定义,我必须将其评论出来。相反,在这种情况下,我想重新定义%%px以便:

  • %%px:将是一个无操作。

  • %%px --local:只运行单元格,没有其他副作用。

或者,所有%%px(只有--local或者没有)都可以运行单元格,如果这更简单。

另一种方法是创建一个假的ipyparallel客户端,即具有0个节点(但仍然可以正常运行,例如关于%%px --local)。但这将是另一个问题。

我尝试的事情

  • %alias_magic px time(毕竟,我不在乎细胞是否定时)。不幸的是,%%time并未对--local提出争论和窒息。

  • 定义我自己的" no-op"魔法:

    if USE_CLIENT:
        pass
    else:
        # temporarily define %%px cell magic
        from IPython import get_ipython
        def px(line, cell):
            """Do nothing"""
            pass
    
        get_ipython().register_magic_function(px, 'cell')
    

    但在实际上没有(即单元格未执行)方面成功得太好了。

  • 查看IPython/core/magics/execution.py以查看是否有任何可以重用的钩子(只会执行单元格)。我还没找到,但也许我看起来不够努力。

还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

我认为相关命令是

  

self.shell.run_cell(小区)

答案 1 :(得分:0)

我们可以定义一个没有效果的魔术命令:

def f(line, cell):
    print('==> line:[{}]'.format(line))
    print('==> cell:\n    # {}'.format('\n    # '.join(cell.split())))
    print('==================================================================')
    res = get_ipython().run_cell(cell)

get_ipython().register_magic_function(f, 'cell', 'cache')

以下是一个示例运行: enter image description here

在您的情况下,请尝试:

if USE_CLIENT:
    pass
else:
    # temporarily define %%px cell magic
    from IPython import get_ipython
    def px(line, cell):
         res = get_ipython().run_cell(cell)
    get_ipython().register_magic_function(px,'cell','px')