¿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?

Joe
fuente
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.

mdeous
fuente
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
Apogentus
fuente
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.

Daniel
fuente
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.

AXO
fuente
23

Todavía no lo he probado, pero acaban de implementar un nuevo punto de interrupción () integrado en Python 3.7, lo que significa que ahora puede insertar un punto de interrupción con una declaración:

breakpoint()
Cuenta
fuente
1
A partir de Python 3.7, esta es la respuesta.
Eric
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

picmate 涅
fuente
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/

Glenjamin
fuente
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.

vvatsa
fuente
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.

Simplex
fuente
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.

Junta de enero
fuente
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.

Chris Abraham
fuente
-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] ...
timbo
fuente
¿Cómo instalar pdb? O de donde
Kenorb