重要

本文档涵盖 IPython 6.0 及更高版本。从 6.0 版本开始,IPython 不再支持与低于 Python 3.3 的 Python 版本(包括所有版本的 Python 2.7)的兼容性。

如果你正在寻找与 Python 2.7 兼容的 IPython 版本,请使用 IPython 5.x LTS 版本并参考其文档(LTS 是长期支持版本)。

IPython 事件

扩展代码可以注册回调函数,这些函数将在 IPython 代码中的特定事件上被调用。你可以在 IPython.core.events 中定义的回调原型函数中查看当前可用的回调列表以及每个回调将传递的参数。

要注册回调,请使用 IPython.core.events.EventManager.register()。例如

class VarWatcher(object):
    def __init__(self, ip):
        self.shell = ip
        self.last_x = None

    def pre_execute(self):
        self.last_x = self.shell.user_ns.get('x', None)

    def pre_run_cell(self, info):
        print('info.raw_cell =', info.raw_cell)
        print('info.store_history =', info.store_history)
        print('info.silent =', info.silent)
        print('info.shell_futures =', info.shell_futures)
        print('info.cell_id =', info.cell_id)
        print(dir(info))

    def post_execute(self):
        if self.shell.user_ns.get('x', None) != self.last_x:
            print("x changed!")

    def post_run_cell(self, result):
        print('result.execution_count = ', result.execution_count)
        print('result.error_before_exec = ', result.error_before_exec)
        print('result.error_in_exec = ', result.error_in_exec)
        print('result.info = ', result.info)
        print('result.result = ', result.result)

def load_ipython_extension(ip):
    vw = VarWatcher(ip)
    ip.events.register('pre_execute', vw.pre_execute)
    ip.events.register('pre_run_cell', vw.pre_run_cell)
    ip.events.register('post_execute', vw.post_execute)
    ip.events.register('post_run_cell', vw.post_run_cell)

在 8.3 版本中添加: 从 IPython 8.3 和 ipykernel 6.12.1 开始,回调中的 info 对象具有 cell_id,当前端发送这些信息时,它将被设置为发送的值。

事件

以下是 IPython 将发出的事件。除非另有说明,否则不会向回调传递任何参数。

shell_initialized

def shell_initialized(ipython):
    ...

此事件仅在设置 IPython 结束时触发一次。作为配置一部分默认加载的已注册扩展可以使用它来执行代码以完成设置。将向回调传递 InteractiveShell 实例。

pre_run_cell

pre_run_cell 在交互式执行(例如笔记本中的单元格)之前触发。它可用于在执行之前记录状态并跟踪更改。将提供一个包含用于代码执行的信息的对象作为参数。

pre_execute

pre_execute 类似于 pre_run_cell,但会在任何执行之前触发。有时代码可以由库等执行,这些库会跳过历史记录/显示机制,在这种情况下,pre_run_cell 不会触发。

post_run_cell

post_run_cell 在交互式执行(例如笔记本中的单元格)之后运行。它可用于清理或通知或对执行期间产生的任何副作用执行操作。例如,内联 matplotlib 后端使用此事件来显示在单元格过程中创建但未显式显示的任何图形。将作为执行结果返回的对象作为参数提供。

post_execute

pre_execute 相同,post_execute 类似于 post_run_cell,但会对所有执行触发,而不仅仅是交互式执行。

另请参见

模块 IPython.core.hooks

较旧的“挂钩”系统允许最终用户自定义 IPython 行为的某些部分。

自定义输入转换

通过注册不更改代码的输入转换器,您可以监视正在执行的内容。