0

我如何定义一个简单的单元魔术,就像%%mymagic不存在一样执行单元?

上下文是我们正在使用出色的IPython 并行框架。在某些地方,我们也使用它定义的%%px魔法。但有时我们想在没有集群的情况下运行同一个笔记本(仅限本地)。在这种情况下,%%px未定义,我将不得不将其注释掉。相反,在这种情况下,我想重新定义%%px

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

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

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

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

我尝试过的事情

  • %alias_magic px time(毕竟,我不在乎单元格是否定时)。不幸的是,%%time不接受争论和窒息--local

  • 定义我自己的“无操作”魔法:

    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看看是否有任何我可以重用的钩子(只会执行单元格的东西)。我还没有找到,但也许我还不够努力。

还有什么想法吗?

4

2 回答 2

1

我认为相关的命令是

self.shell.run_cell(细胞)

于 2015-10-28T03:40:52.000 回答
1

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

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')

这是一个示例运行: 在此处输入图像描述

在您的情况下,请尝试:

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')
于 2018-05-04T08:40:59.753 回答