Cómo ejecutar declaraciones de varias líneas dentro del propio depurador de Python (PDB)

4 minutos de lectura

avatar de usuario
Miguel

Así que estoy ejecutando un script de Python dentro del cual llamo al depurador de Python, PDB escribiendo:

import ipdb; ipdb.set_trace()

(La versión de PDB de iPython, aunque no creo que haga una diferencia; la uso solo para la salida en color).

Ahora, cuando llego al depurador, quiero ejecutar una declaración de varias líneas, como una cláusula if o un bucle for, pero tan pronto como escriba

if condition:

y presiono la tecla de retorno, aparece el mensaje de error *** SyntaxError: invalid syntax (<stdin>, line 1)

¿Cómo se pueden ejecutar declaraciones de varias líneas dentro de PDB? Si no es posible, ¿hay alguna forma de evitar esto para seguir ejecutando una cláusula if o un bucle for?

Puede hacer esto mientras está en pdb para iniciar una sesión de Python interactiva temporal con todas las variables locales disponibles:

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

Cuando haya terminado, use Ctrl-D para volver al indicador de pdb normal.

Simplemente no presione Ctrl-C, eso terminará toda la sesión de pdb.

  • Parece que se puede lograr lo mismo usando el pdb interact dominio (como aprendí de este mensaje de seguimiento de errores).

    – Gerrit

    11 de junio de 2014 a las 15:15

  • Porque es el ! necesario en el import ¿declaración?

    – Indradhanush Gupta

    14 de noviembre de 2014 a las 9:06

  • Probablemente no sea necesario, pero tengo la costumbre de prefijar todas las declaraciones de Python en pdb con !, para evitar accidentes. P.ej c = 42 en pdb seria Seguir ejecución en lugar de asignar a la variable c.

    – Marius Gedminas

    14 de noviembre de 2014 a las 14:10

  • @MariusGedminas ¡lo más frustrante con PDB! Sería bueno si sus los comandos tenían que ser prefijados…

    – IanClark

    22 de abril de 2015 a las 7:31

  • Nota: Ctrl-D parece ser la forma correcta de salir interact también, pero no funciona bien con Spyder para mí.

    – Josías Yoder

    08/06/2018 a las 19:40

avatar de usuario
vaer-k

en python3 ipdb (y pdb) tener un comando llamado obrar recíprocamente. Se puede utilizar para:

Inicie un intérprete interactivo (usando el código módulo) cuyo espacio de nombres global contiene todos los nombres (globales y locales) que se encuentran en el ámbito actual.

Para usarlo, simplemente ingrese interact en el indicador de pdb. Entre otras cosas, es útil para aplicar código que abarca varias líneas y también para evitar la activación accidental de otros comandos pdb.

  • Me da “NameError: el nombre ‘interactuar’ no está definido” al hacer eso.

    – Jasón

    14 de diciembre de 2017 a las 4:10

  • @jason versión 3.2 o superior

    – vaer-k

    14 de diciembre de 2017 a las 4:13

  • Eso explica. Yo estaba en python 2.7.

    – Jasón

    14 de diciembre de 2017 a las 6:49

  • Cuidado, esto realmente arrojó un error que interactúa podría no estar definido y salió del proceso

    – Camron_Godbout

    27 de enero de 2018 a las 14:15

  • Creo que sugiriendo evitar interact es una sugerencia demasiado fuerte. 90% esto es todo lo que necesito, y es mucho más fácil de escribir que from IPython import embed; embed()

    – vaer-k

    7 de febrero de 2020 a las 20:18

avatar de usuario
fx-kirin

Mi recomendación es utilizar la incrustación de IPython.

ipdb> from IPython import embed; embed()

  • Si tiene un error de valor no definido en la comprensión de la lista, intente usarlo desde IPython import embed; embed(user_ns=locals()).

    – fx-kirin

    29 de enero de 2019 a las 5:41

  • esto funciona mucho mejor para mí que la respuesta aceptada. Por ejemplo, permite la edición adecuada de líneas múltiples, como retroceder algunas líneas y arreglar algo, para que no tenga que volver a escribir toda la expresión de líneas múltiples nuevamente… Estoy pasando a los locales como @fx-kirin sugirió.

    – ZeDuS

    12 de noviembre de 2019 a las 8:05


Dentro del intérprete o depurador de Python (2.7.1) (importar pdb), puede ejecutar una declaración de varias líneas con la siguiente sintaxis.

for i in range(5): print("Hello"); print("World"); print(i)

Nota: cuando estoy dentro del intérprete, tengo que presionar regresar dos veces antes de que se ejecute el código. Sin embargo, dentro del depurador, solo tengo que presionar regresar una vez.

Existe el caso especial si desea que se ejecuten un par de comandos al llegar a un punto de ruptura. Luego está el comando del depurador commands. Le permite ingresar varias líneas de comandos y luego finalizar toda la secuencia con el end palabra clave más con (pdb) help commands.

No sé si puedes hacer esto, aunque sería una gran característica para ipdb. Por supuesto, puede usar listas de comprensión y ejecutar expresiones simples de varias líneas como:

if y == 3: print y; print y; print y;

También puede escribir algunas funciones de antemano para hacer lo que sea que necesite hacer que normalmente tomaría varias líneas.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad