重要

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

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

IPython 内核中单元格的执行

当 IPython 内核收到包含用户代码的 execute_request 时,它会按照以下阶段处理消息

  1. 触发 pre_execute 事件。

  2. 触发 pre_run_cell 事件,除非 silent 为 True

  3. 执行 run_cell 方法以预处理 code、编译并运行它,详情请见下文。

  4. 如果执行成功,则会计算 user_expressions 中的表达式。这可确保表达式中的任何错误不会影响主代码执行。

  5. 触发 post_execute 事件。

  6. 触发 post_run_cell 事件,除非 silent 为 True

另请参见

IPython 事件

运行用户 code

首先,code 单元格会被转换为展开 %magic!system 命令,由 IPython.core.inputtransformer2 执行。然后使用标准 Python compile() 函数编译展开的单元格并执行它。

Python compile() 函数提供了 mode 参数,用于选择三种编译代码方式之一

single

适用于单个交互式语句(尽管源代码可以包含多行,例如 for 循环)。在此模式下编译时,生成的字节码包含特殊指令,用于触发调用 sys.displayhook(),以处理块中返回值的任何表达式。这意味着单个语句实际上可以产生对 sys.displayhook() 的多次调用,例如,如果它包含一个循环,其中每次迭代计算未赋值的表达式将生成 10 次调用

for i in range(10):
    i**2
exec

任意数量的源代码,这是模块的编译方式。从不隐式调用 sys.displayhook()

eval

返回值的单个表达式。从不隐式调用 sys.displayhook()

code 字段被拆分为各个块,每个块都适用于在“single”模式下执行,然后

  • 如果只有一个块:它将在“single”模式下执行。

  • 如果有多个块

    • 如果最后一个块只有一行长,则以“exec”模式运行除最后一个块之外的所有块,并以“single”模式运行最后一个块。这使得在最后轻松键入简单表达式以查看计算值。

    • 如果最后一个块不超过两行长,则以“exec”模式运行除最后一个块之外的所有块,并以“single”模式运行最后一个块。这使得在最后轻松键入简单表达式以查看计算值。 - 否则(最后一个也是多行的),以“exec”模式运行所有块作为一个单元。

    • 否则(最后一个块也是多行的),以“exec”模式运行所有块作为一个单元。