43

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
  • 26,899
  • 12
  • 60
  • 88
  • 1
    There's no function like `%step`. You can `%run -d` a whole script, but you can't do the same thing for a single statement or function call. You can manually `pdb.run("foo(1, 2)")` or `pdb.runcall(foo, 1, 2)`. – abarnert Sep 28 '12 at 20:21
  • I was just wondering the same thing today. I would use this all the time if it was available. Time to dig into the iPython source to see how it could be implemented. – Daniel Roseman Sep 28 '12 at 20:22
  • Possible duplicate of [Is it possible to run commands in IPython with debugging?](https://stackoverflow.com/questions/9689378/is-it-possible-to-run-commands-in-ipython-with-debugging) – ivan_pozdeev Sep 20 '17 at 19:09

2 Answers2

66

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>
Ian Clelland
  • 43,011
  • 8
  • 86
  • 87
  • 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 Sep 28 '12 at 20:51
  • 9
    Actually it turns out you don't need the external ipdb, you can just do `from IPython.core.debugger import Pdb; ipdb=Pdb()`. – Daniel Roseman Sep 28 '12 at 20:57
  • 1
    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... – ivan_pozdeev Oct 14 '15 at 21:24
37

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.

Jean Paul
  • 1,439
  • 18
  • 21