Execution of cells in the IPython kernel
When IPython kernel receives execute_request with user code, it processes the message in the following phases:
Fire the
pre_executeevent.Fire the
pre_run_cellevent unless silent isTrue.Execute
run_cellmethod to preprocesscode, compile and run it, see below for details.If execution succeeds, expressions in
user_expressionsare computed. This ensures that any error in the expressions don’t affect the main code execution.Fire the
post_executeevent.Fire the
post_run_cellevent unless silent isTrue.
See also
Running user code
First, the code cell is transformed to expand %magic and !system
commands by IPython.core.inputtransformer2. Then expanded cell is compiled
using standard Python compile() function and executed.
Python compile() function provides mode argument to select one
of three ways of compiling code:
- single
Valid for a single interactive statement (though the source can contain multiple lines, such as a for loop). When compiled in this mode, the generated bytecode contains special instructions that trigger the calling of
sys.displayhook()for any expression in the block that returns a value. This means that a single statement can actually produce multiple calls tosys.displayhook(), if for example it contains a loop where each iteration computes an unassigned expression would generate 10 calls:for i in range(10): i**2
- exec
An arbitrary amount of source code, this is how modules are compiled.
sys.displayhook()is never implicitly called.- eval
A single expression that returns a value.
sys.displayhook()is never implicitly called.
The transformed code is parsed into a single abstract syntax tree, and its
top-level nodes are executed one after the other. Which nodes get to display
their value is controlled by the InteractiveShell.ast_node_interactivity
option (default: last_expr): nodes selected for display (by default, the
last node, if it is an expression) are compiled in ‘single’ mode so that
sys.displayhook() is triggered, while all other nodes are compiled in
‘exec’ mode. This makes it easy to type simple expressions at the end of a
cell to see computed values. Other accepted values for
ast_node_interactivity are all, last, none and
last_expr_or_assign.