如何定义一个只执行单元格的简单单元格魔术,好像%%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以查看是否有任何可以重用的钩子(只会执行单元格)。我还没找到,但也许我看起来不够努力。
还有其他想法吗?
答案 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')
在您的情况下,请尝试:
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')