2012-09-28 36 views
29

¿Hay alguna manera de entrar en la primera línea de una función en ipython. Me imagino algo que se vería así:Entrando en una función en IPython

%step foo(1, 2) 

que corre ipdb y establece un punto de interrupción en la primera línea de foo.

Si quiero hacer esto ahora, tengo que ir al código fuente de la función y agregar una línea import ipdb; ipdb.set_trace().

+1

No hay función como '% step'. Puede '% ejecutar -d' un script completo, pero no puede hacer lo mismo para un único enunciado o llamada de función. Puede manualmente 'pdb.run (" foo (1, 2) ")' o 'pdb.runcall (foo, 1, 2)'. – abarnert

+0

Me preguntaba lo mismo hoy. Yo usaría esto todo el tiempo si estuviera disponible. Es hora de profundizar en la fuente de iPython para ver cómo podría implementarse. –

+0

Posible duplicado de [¿Es posible ejecutar comandos en IPython con depuración?] (Https://stackoverflow.com/questions/9689378/is-it-possible-to-run-commands-in-ipython-with-debugging) –

Respuesta

42

ipdb ha tenido soporte para runcall, runeval y se ejecuta desde 0.7, a principios de este año. Puede usarlo como 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> 
+0

Eso es más o menos lo que necesito. Gracias por señalar la actualización 0.7, tenía una versión anterior. Teniendo eso, probablemente sea fácil agregar una magia ipython que use runcall. –

+8

En realidad resulta que no necesita el ipdb externo, puede hacer 'desde IPython.core.debugger importar Pdb; ipdb = Pdb() '. –

+1

No es el método más elegante. Esperaba una función mágica para una necesidad tan común. Me pregunto si no es una necesidad común para los usuarios de 'SciPy' ... –

Cuestiones relacionadas