¿Una forma más sencilla de poner puntos de interrupción de PDB en el código Python?


105

Solo una pregunta de conveniencia. Me han echado a perder un poco los depuradores en IDE como Visual Studio y XCode. Me parece un poco torpe tener que escribir import pdb; pdb.set_trace()para establecer un punto de interrupción (prefiero no importar pdb en la parte superior del archivo, ya que podría olvidarlo y dejarlo).

¿Existe una forma más sencilla de establecer un punto de interrupción en el código Python, tan sencilla y discreta como lo que ve en un IDE?


Utilice PyCharm. ¿Cómo podría ser más simple que ingresar una línea de punto de interrupción, excepto para ejecutar usando un IDE de Python?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Solo use python -m pdb <your_script>.py entonces b <line_number>para establecer el punto de interrupción en el número de línea elegido (sin paréntesis de función). Presione cpara continuar hasta su punto de ruptura. Puede ver todos sus puntos de interrupción usando el bcomando solo. Escriba helppara ver otros comandos pdb disponibles durante la depuración.
arcseldon

1
Desde Python 3.7, ahora puede usar la breakpoint()función incorporada . python.org/dev/peps/pep-0553
Daniel

Respuestas:


117

Puede ejecutar su programa pdbdesde la línea de comandos ejecutando

python -m pdb your_script.py

Se romperá en la primera línea, luego podrá agregar un punto de interrupción donde quiera en su código usando el breakcomando, su sintaxis es:

b (reak) [[nombre de archivo:] lineno | función [, condición]]

Es lo suficientemente flexible como para darle la capacidad de agregar un punto de interrupción en cualquier lugar.


24
para aclarar este punto, si pdb.set_trace()voy al depurador, uso el lcomando (lista) y veo que quiero establecer un punto de interrupción en la línea 27, luego ingresaría: b 27y el depurador establecería un punto de interrupción en la línea 27 (encontré la documentación es un poco difícil de entender, así que quería agregar ese punto de aclaración).
benjaminmgross

9
Además, si tiene un objeto xy desea detenerse cuando fse llama a su método , puede decir break x.f, y luego c(ontinue). Esto funciona incluso si el objeto está en un archivo inaccesible o fue creado dinámicamente, por ejemplo, al despegar.
osa

2
Al depurar después de un seguimiento de pila, puede copiar la ruta completa a un módulo y agregar el número de línea comob /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
válido el

58

Puedes usar:

from pdb import set_trace as bp

code
code
bp()
code
code

no estoy seguro de por qué el alias superfluo, pero ;-). Por alguna razón, mi IDE / Editor (vscode) estaba siendo una yegua en este AM y sigue subrayando. Ver tu comentario realmente me ayudó. ¡Que tengas un gran día!
MrMesees

Muchas gracias!
amarrado el

¿Cómo puedo forzar la importación set_tracesolo cuando uso bp ()?
alper

39

En vim, tengo una macro configurada para esto (en mi archivo .vimrc):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

así que puedo presionar \ b (cuando no esté en modo Insertar) y agrega un punto de interrupción después de la línea actual, o \ B (tenga en cuenta la capital) y coloca uno antes de la línea actual.

que parece funcionar bien. La mayoría de los otros editores de programadores 'simples' (emacs, sublimetext, etc.) deberían tener formas fáciles similares de hacer esto.

Editar: de hecho tengo:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

que lo enciende solo para archivos fuente de Python. Puede agregar fácilmente líneas similares para javascript o cualquier otro idioma que use.

Actualización de 2019 (Python 3.7+)

Python 3.7+ ahora tiene incorporado breakpoint()que puede reemplazar al anterior import pdb; pdb.set_trace()en vim. Todavía funciona igual.


2
Buena solución, y la línea agregada también tendrá la sangría correcta si la tiene set autoindenten su archivo .vimrc .
Jealie

Sí, no puedo entender por qué la mayoría de las distribuciones no vienen con set autoindent(y un montón de otras opciones) como estándar. Una de las primeras cosas que hago con un nuevo sistema es incorporar un mejor vimrc ...
Daniel

1
¡Solo use un registro llamado vim! Guarde la línea que desea almacenar en búfer 'd' (como en d ebug) presionando "dyyy siempre que lo necesite simplemente haga "dpo "dP. ¡Aprenda los registros vim ! ¡Son muy útiles y siempre están respaldados!
polvoazul

cómo agregar: w después de eso?
ji-ruh

Llevando el concepto de registro con nombre un poco más allá, puede grabar una macro, realizar las operaciones necesarias y luego detener la macro. Luego pegue el contenido de la macro en su archivo vimrc. Por ejemplo, inicie la macro con qdy luego "dppegue. Finalmente, asigne sus instrucciones a un registro para que siempre se llenen en la carga de vim. Ejemplo: let @d = 'oimport pdb; pdb.set_trace()k0:w' ahora, utilícelo @dsiempre que desee pegar la línea en un archivo. Lo anterior también guarda el archivo. Pero tendrá que grabar el suyo (en lugar de copiar / pegar arriba) ya que se trata de caracteres especiales (para escapar, etc.).
arcseldon

27

Si no desea establecer puntos de interrupción manualmente cada vez que ejecuta el programa (en Python 3.2+), por ejemplo, diga que desea crear directamente un punto de interrupción en la línea 3 y detener la ejecución allí:

python -m pdb -c "b 3" -c c your_script.py

La siguiente información puede ayudar:

Si existe un archivo .pdbrc en el directorio de inicio del usuario o en el directorio actual, se lee y se ejecuta como si se hubiera escrito en el indicador del depurador. Esto es particularmente útil para los alias. Si ambos archivos existen, primero se lee el del directorio de inicio y los alias definidos allí pueden ser anulados por el archivo local.

Modificado en la versión 3.2: .pdbrc ahora puede contener comandos que continúan depurando, como continuar o siguiente. Anteriormente, estos comandos no tenían ningún efecto.

Nuevo en la versión 3.2: pdb.py ahora acepta una opción -c que ejecuta comandos como si estuvieran dados en un archivo .pdbrc, consulte Comandos del depurador.



10

Así es como usaría pdb en la línea de comando sin implementar nada en su código fuente (la documentación y otros recursos en línea no hacen un buen trabajo al explicar esto a un programador que solo ha usado depuradores visuales en el pasado):

Inicie pdb escribiendo lo siguiente en un indicador de shell:

python -m pdb 'python_script'

Este comando inicializa pdb y el depurador de pdb se interrumpirá en la primera línea de su python_script y esperará una entrada suya:

(Pdb)

Esta es la interfaz para comunicarse con el depurador. Ahora, puede especificar sus comandos aquí. A diferencia de usar botones o atajos de teclado en depuradores visuales, aquí usará comandos para obtener los mismos resultados.

Puede ir a la siguiente línea de su código con el comando "n" (siguiente):

(Pdb) n

Realizar un siguiente mostraría el número de línea y el código específico en la fuente:

> python_script(line number)method name
-> current line in the source code

Puede establecer un punto de interrupción especificando un número de línea en su código fuente.

(Pdb) b 50

Aquí, el depurador está configurado para romperse en la línea 50. Si no hay otros puntos de interrupción, el punto de interrupción en la línea 50 será el primero y podría ser referenciado por la identificación del punto de interrupción, que es 1 en este caso. Si agrega más puntos de interrupción, obtendrán identificadores secuencialmente (es decir, 2, 3, etc.)

Una vez que se establece un punto de interrupción, continuará ejecutando su programa hasta que pdb llegue al punto de interrupción de la siguiente manera:

(Pdb) c

Una vez que llegue a un punto de interrupción, puede pasar a la siguiente línea, con el comando n como se describió anteriormente. Si desea examinar los valores de las variables, ejecute el comando de parámetro de la siguiente manera:

(Pdb) p variable_name

Si ya no necesita un punto de interrupción, puede borrarlo pasando el id del punto de interrupción con el comando clear:

(Pdb) clear 1

Finalmente, cuando haya terminado con el depurador, puede salir de la ejecución como lo haría con el intérprete de línea de comandos de Python.

(Pdb) exit()

Espero que esto ayude a cualquiera a comenzar con pdb. Aquí hay una lista de comandos que puede usar con el depurador: pdb así que preguntas y respuestas



4

Puede usar un IDE que admita la depuración de Python, o puede consultar la excelente herramienta Winpdb. Que funciona en cualquier plataforma y proporciona facilidades de depuración gráfica para su script de Python.

http://winpdb.org/


2

Puedes usar:

  • ala ide
  • eclipse con el complemento pydev
  • pycharms

Todo lo anterior admite la depuración de Python desde dentro de un IDE.


0

En Atom, si los complementos de Python están instalados, puede escribir 'pdb ' y presionar enter y el fragmento escribirá import y rastreará por usted.

Me he acostumbrado a esto ahora que a veces simplemente lo escribo incluso si lo estoy editando en vim y esperando que aparezca el menú desplegable.


0

Un método subestimado es establecer un punto de interrupción en pdb directamente:

pdb> b torch/__init__:10

establecerá un punto de interrupción en site-packages\torch\__init__.py:10

Luego pdb> cse detendrá en este punto de ruptura.

Los siguientes también son válidos:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

Consulte el documento para obtener más detalles.


0

Puede usar Vim con el complemento Python-Mode o Emacs con Elpy complemento .

Estos complementos le brindan puntos de interrupción con pulsaciones de teclas fáciles ( \ ben Vim y C-c C-u ben Emacs) además de muchas otras características de IDE de gran peso (plegado de código, refactorización, linting, etc.), todo dentro de un editor de texto ligero basado en terminal.


-1

La forma más sencilla de ejecutar el depurador en su secuencia de comandos es simplemente

pdb your_script.py

Ejecutar pdb en una línea de comandos de Linux da

usage: pdb.py scriptfile [arg] ...

¿Cómo instalar pdb? O de donde
Kenorb
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.