是否可以在IPython / Jupyter中组合魔术?

时间:2018-11-08 08:45:26

标签: python jupyter-notebook ipython

有时您想同时使用几种魔法。现在我知道您可以使用

%%time
%%bash
ls 

但是当我执行自己的命令时,此链接不起作用...

from IPython.core.magic import register_cell_magic

@register_cell_magic
def accio(line, cell):
    print('accio')
    exec(cell)

使用

会导致错误
%%accio
%%bash
ls

我应该使用什么而不是exec

2 个答案:

答案 0 :(得分:2)

您必须应用IPython特殊转换,以使用单元格like the %%time magic运行嵌套魔术:

@register_cell_magic
def accio(line, cell):
    ipy = get_ipython()
    expr = ipy.input_transformer_manager.transform_cell(cell)
    expr_ast = ipy.compile.ast_parse(expr)
    expr_ast = ipy.transform_ast(expr_ast)
    code = ipy.compile(expr_ast, '', 'exec')
    exec(code)

或直接致电run_cell

@register_cell_magic
def accio(line, cell):
    get_ipython().run_cell(cell)

结果:

In [1]: %%accio
   ...: %%time
   ...: %%bash
   ...: date
   ...:
accio
Wed Nov 14 17:41:55 CST 2018
CPU times: user 1.42 ms, sys: 4.21 ms, total: 5.63 ms
Wall time: 9.64 ms

答案 1 :(得分:0)

在IPython源代码中,他们几乎总是使用一个类来创建魔术语句,因为它们可以保存值,我认为这就是您想要的。

检查此源代码以查看一些examples