重要
本文档涵盖 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
时,它会按照以下阶段处理消息
触发
pre_execute
事件。触发
pre_run_cell
事件,除非 silent 为True
。执行
run_cell
方法以预处理code
、编译并运行它,详情请见下文。如果执行成功,则会计算
user_expressions
中的表达式。这可确保表达式中的任何错误不会影响主代码执行。触发
post_execute
事件。触发
post_run_cell
事件,除非 silent 为True
。
另请参见
运行用户 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”模式运行所有块作为一个单元。