Ipython 创建一个单元格magics,在单元格执行之前和之后执行代码

Ipython 创建一个单元格magics,在单元格执行之前和之后执行代码,ipython,jupyter-notebook,jupyter,ipython-magic,Ipython,Jupyter Notebook,Jupyter,Ipython Magic,我有一个特殊的类,用于捕获和处理给定算法的日志。这看起来像这样 report = Report2File(logger,"./path") report.start() solveProblem() report.stop() del report 我想变得更懒,只写东西 %%report "./path" solveProblem() 这种神奇细胞的创造一开始很容易 更新: @magics_class class MyMagics(Magics): @cell_magic

我有一个特殊的类,用于捕获和处理给定算法的日志。这看起来像这样

report = Report2File(logger,"./path")
report.start()

solveProblem()

report.stop()
del report
我想变得更懒,只写东西

%%report "./path"
solveProblem()
这种神奇细胞的创造一开始很容易

更新:

@magics_class
class MyMagics(Magics):

    @cell_magic
    def cmagic(self, line, cell):
        "my cell magic"
        self.before()
        exec(cell)
        self.after()
        return line, cell

    def before(self):
        do stuff ...

    def after(self):
        do stuff ...

ip = get_ipython()
ip.register_magics(MyMagics)
但我有两个问题:

  • 我不知道如何将logger对象传递给我的magic
  • Jupyter一直告诉我MyMagics模块不是ipython扩展
  • 部分答案 给我答案2

    而不是

    ip = get_ipython()
    ip.register_magics(MyMagics)
    
    注册魔法的正确方法如下

    def load_ipython_extension(ip):
        ip.register_magics(MyMagics)
    
    def unload_ipython_extension(ip):
        pass
    

    您还需要使用
    @magics\u class
    (来自IPython.core.magic)装饰类。

    要传递参数,请查看
    @magic_arguments
    文档中的示例:这很容易理解。

    您还需要使用
    @magics_class
    (来自IPython.core.magic)装饰类。

    要传递参数,请查看
    @magic_arguments
    文档中的示例:这很容易理解。

    @magics_class
    是必需的,但不足以解决这两个问题。我只是忘了提一下
    @magics_class
    是必需的,但不足以解决这两个问题。我只是忘了提一下。