¿Cómo automatizar los comandos pdb?

Estoy llamando a pdb en alguna función de func es decir,

 def fun(): a = 10 c = fun2(a) d = 40 return c+d def fun2(a): xyz ='str' return a+10 

Ahora estoy ejecutando pdb usando pdb.runcall(func,a,b) ahora Abrirá una consola pdb para la depuración, ahora supongo que presiono 2 veces s (paso) q para quit en la consola pdb , pero el problema es que no lo hago. Quiero hacer esto manualmente, quiero hacer un script que haga algo como esto (decirle automáticamente a pdb el primer comando es s luego el tercero es q ), pregunto porque hay muchas funciones que necesitan al menos dos veces c (continuar) para Ejecución general de la función para que pueda generar / devolver algún resultado válido (como, por ejemplo, generadores)

Cualquier ayuda será una ayuda seria para mí.

Actualizar después de entender mejor la pregunta:

En general, no creo que esta sea la forma ideal de probar el código; El diseño de código para la capacidad de prueba (p. ej., el uso de TDD) a menudo resultará en funciones que son más fáciles de probar (p. ej., usar simulacros / objetos falsos, dependency injection, etc.), y le animo a que considere la posibilidad de refactorizar el código si es posible. El otro problema con este enfoque es que las pruebas se pueden acoplar muy estrechamente al código. Sin embargo, asumiré aquí que sabe lo que está haciendo y que lo anterior no es una opción por ningún motivo.

Pdb de scripting

Si desea crear una secuencia de comandos pdb desde el código, esto es realmente posible mediante la pdb.Pdb instancias de su propia clase pdb.Pdb y pasando el stdin y, en el momento de escribir, el argumento stdout (no estoy seguro de que ambos deban ser necesarios, he archivado https://bugs.python.org/issue33749 ).

Ejemplo (acabo de agregar el argumento de entrada adicional a la fun ):

 def fun(i): a = 10 + i c = fun2(a) d = 40 return c+d def fun2(a): xyz ='str' return a+10 import pdb import io output = io.StringIO() # this contains the pdb commands we want to execute: pdb_script = io.StringIO("pi;; i = 100;; n;; pa;; c;;") mypdb = pdb.Pdb(stdin=pdb_script, stdout=output) 

Resultado normal (sin scripting):

 In [40]: pdb.runcall(fun, 1) ...: > (2)fun() -> a = 10 + i (Pdb) (Pdb) c Out[40]: 61 

Pdb con guión:

 In [44]: mypdb = pdb.Pdb(stdin=pdb_script, stdout=output) In [45]: mypdb.runcall(fun, 1) Out[45]: 160 In [50]: print(output.getvalue()) > (2)fun() -> a = 10 + i (Pdb) 1 > (3)fun() -> c = fun2(a) 110 

Puede ser pdb_script.seek(0) usar pdb_script.seek(0) para restablecer el script.

Respuesta original – usando puntos de interrupción condicionales

Parece que lo que realmente desea es ingresar al depurador solo cuando su código se encuentra en un estado determinado. Esto se puede hacer con puntos de interrupción condicionales (consulte la documentación de pdb para obtener más información). Por ejemplo, digamos que quiere dividir en fun2 si a > 10 :

  ...: In [2]: import pdb In [3]: pdb.runcall(fun, 1) > (2)fun() -> a = 10 + i (Pdb) break fun2, a > 10 Breakpoint 1 at :6 (Pdb) c > (7)fun2() -> xyz ='str' (Pdb) c Out[3]: 61 In [4]: pdb.runcall(fun, -1) > (2)fun() -> a = 10 + i (Pdb) c Out[4]: 59 

Observe que en el primer caso que golpeó el punto de interrupción, en el segundo no lo hizo.

Respuesta original: usar puntos de interrupción y ejecutar comandos al golpear

También puede intentar establecer un punto de interrupción y utilizar la función de comandos .