Stepping into a function in IPython

16,910

Solution 1

ipdb has had support for runcall, runeval and run since 0.7, earlier this year. You can use it just like pdb.runcall:

In [1]: def foo(a, b):
   ...:     print a + b
   ...:

In [2]: import ipdb

In [3]: ipdb.runcall(foo, 1, 2)
> <ipython-input-1-2e565fd9c4a4>(2)foo()
      1 def foo(a, b):
----> 2     print a + b
      3

ipdb>

Solution 2

The IPython magic you was asking for is now implemented with the newer versions: https://stackoverflow.com/a/46333421/4374441

You just have to type %debug foo(1, 2) then s to step into the function.

Share:
16,910
Daniel
Author by

Daniel

Updated on June 19, 2022

Comments

  • Daniel
    Daniel about 2 years

    Is there a way to step into the first line of a function in ipython. I imagine something that would look like:

    %step foo(1, 2)
    

    which runs ipdb and sets a breakpoint at the first line of foo.

    If I want to do this now I have to go to the function's source code and add an import ipdb; ipdb.set_trace() line.

  • Daniel
    Daniel over 11 years
    That's pretty much what I need. Thanks for pointing out the 0.7 update, I had an older version. Having that it's probably easy to add an ipython magic which uses runcall.
  • Daniel Roseman
    Daniel Roseman over 11 years
    Actually it turns out you don't need the external ipdb, you can just do from IPython.core.debugger import Pdb; ipdb=Pdb().
  • ivan_pozdeev
    ivan_pozdeev over 8 years
    Not the most elegant method. I expected a magic function for such a common need. I wonder if it's not a common need for SciPy users...
  • El'endia Starman
    El'endia Starman over 5 years
    Six years later to the day from the original answer! +1 works for me.