instalar como python debugging spyder

como - spyder python 3.6 download



¿Cómo depuro eficientemente con Spyder en Python? (7)

Me gusta Python y me gusta Spyder, pero me parece que la depuración con Spyder es terrible.

  • Cada vez que pongo un punto de interrupción, necesito presionar dos botones: primero la depuración y luego el botón de continuar (se detiene automáticamente en la primera línea), lo cual es molesto.
  • Además, en lugar de tener la consola estándar de iPython con finalización automática, etc., tengo una consola pésima de ipdb >> que es simplemente basura.
  • Lo peor es que esta consola se congela con mucha frecuencia, incluso si escribo impresiones o evaluaciones simples para tratar de descubrir cuál es el error. Esto es mucho peor que el matlab.
  • Por último, pero no menos importante, si llamo a una función desde la consola ipdb >> y pongo un punto de interrupción en ella, no se detendrá allí. Parece que tengo que poner el punto de interrupción allí antes de comenzar la depuración (ctrl + F5).

¿Tiene una solución o tal vez puede decirme cómo depura las secuencias de comandos y las funciones de Python?

Estoy usando una nueva instalación de Anaconda en un Windows 8.1 de 64 bits.


Flujo de trabajo de depuración

pdb comprender que, de hecho, está utilizando una integración diferente del depurador Python pdb e ipdb (que usa pdb y al que se puede acceder usando el módulo ipdb ). Espero que este ejemplo trivial te ayude a usarlo mejor.

Suponga que desea depurar este código:

def Waiting_fun(): #1 line number one for i in range(100): #2 pass #3 #4 def New_sum(lista, to_s = False): #5 result = 0 #6 print 1 #7 for i in lista: #8 print "summed" #9 result +=i #10 Waiting_fun() #11 if to_s: #12 result = str(result) return result a = New_sum([1,4,5,7,8]) b = New_sum([1,4],1) c = 456 d = New_sum([6,8,9],1) final_result = a*b*c*d Out: Type error

Primera depuración rápida usando iPython% debug

%debug

Lo primero que hago es llamar a pdb desde iPython usando el comando mágico %debug , puedes configurarlo como un mecanismo predeterminado usando %pdb .

%debug > /home/opdate/Desktop/test.py(23)<module>() 19 a = New_sum([1,4,5,7,8]) 20 b = New_sum([1,4],1) 21 c = 456 22 d = New_sum([6,8,9],1) ---> 23 final_result = a*b*c*d

Una vez que almuerzas pdb . Puede encontrar todos los comandos en los documentos oficiales o puede usar el comando h para mostrarlos. En esta etapa, los únicos comandos que uso son:

  • p : imprime las variables que especifique
  • pp : impresiones bonitas
  • args : si está dentro de una función, imprime los argumentos
  • pp locals() : puede ser útil para imprimir todas las variables, ¡pero la mayoría de las veces es un desastre!
  • ! úselo si desea evitar conflictos con los comandos enumerados en h
  • whatis variable_name: equivalente de tipo (variable_name)
  • u : Mueve el cuadro actual un nivel hacia arriba en el seguimiento de la pila (a un cuadro anterior).
  • d : Mueve el cuadro actual un nivel hacia abajo en la traza de la pila (a un cuadro más nuevo).
  • q : cuando termine, puede usar q para salir

En nuestro caso:

ipdb> pp a,b,c,d (25, ''5'', 456, ''23'')

O ipdb> !a,b,c,d (sin espacio entre la marca de esclavitud y el primer valor). Está claro que byd son cadenas en caso de que podamos usar:

ipdb> whatis b <type ''str''>

Profundizando usando puntos de quiebre

El 70% de las veces %debug lleva a la solución. Cuando necesite más funciones, como puntos de interrupción, es hora de usar Spyder. En este caso, queremos entender por qué b es una cadena y ponemos un punto de interrupción al lado. Me parece mucho mejor usar la consola Python estándar en lugar de la consola IPython para la depuración, así que seleccione la consola antes de comenzar la depuración:

Luego abra el variable explorer si hay alguna variable, elimínelas. Utilizo Ctrl + F5 para iniciar la depuración, puede usar los botones en la parte superior, pero prefiero usar sus accesos directos que se muestran a continuación:

(Pdb) c # we go to the breakpoint (Pdb) s # we step into the function (Pdb) args # we see what parameters are inserted (Pdb) s # going step-by-step (Pdb) ⏎ # series of Enters go line by line quicker #Here I''ll use whatis command but in fact I just look to # the type in variable explorer of spyder. (Pdb) whatis result #check if result is still int (Pdb) unt #or until -useful to exiting from loops see doc. (Pdb) n # we don''t enter to the Waiting_fun function (Pdb) s # going step-by-step (Pdb) whatis result #we find that there the int is converted (Pdb) j 6 # for double checking we jump back to 6 were the result is assigned # We may be tempted to j(ump) to line 12 but doing so we would skip all the code #for avoiding a series of `s`,`unt` and `n` we can use this solution: (Pdb) tbreak 12 #set a new temporary breakpoint. Also `b` it''s ok most of the time (Pdb) c # go to it (Pdb) j 6 # we jump to 6 the code we jump is NOT executed (Pdb) whatis result# we find that if we jump 12-13 result is still int

Ahora hemos localizado el error. También podemos probar una solución , repetimos el paso hasta 12 y establecemos to_s = False

(Pdb) to_s = False #!to_s = False to be on the safe side

Funciona. Una característica importante que usa el pdb estándar en la consola de Python es que tienes competencia automática y puedes usar el explorador de variables en lugar de usar whatis y pp :

Usando el explorador de variables también puede cambiar el valor de las variables, lo que hace que las cosas sean aún más rápidas.

Puntos de corte condicionales

Otra forma más inteligente de localizar el error es usar un punto de interrupción condicional ( Shift + F12 ), una gran ventaja de Spyder es depurar y usar los puntos de interrupción de la lista. Los puntos de interrupción condicionales se activan cuando la condición es True En nuestro caso, queremos ubicar dónde b se convierte en una cadena de modo que la condición sea: type(b) == str . Por lo general, coloco muchos puntos de interrupción condicionales y veo cuál cumple la condición. Para hacerlo, no use Shift + F12, pero coloque los puntos de interrupción normales haciendo doble clic al lado de la línea y vaya a Depurar-> Listar puntos de interrupción y copie y pase la condición en la tabla a cada punto de interrupción como se muestra en la figura a continuación.

Desde aquí los comandos a utilizar son:

(Pdb) c # go to the first (Pdb) u # it helps to understand when it happened (Pdb) d # come back to the breakpoint


( Dev Spyder aquí ) Somos conscientes de que la experiencia de depuración en Spyder está lejos de ser ideal. Lo que ofrecemos en este momento es muy similar al depurador estándar de Python, pero estamos trabajando para mejorar las cosas en nuestra próxima versión principal para proporcionar algo más cercano a lo que cualquier científico esperaría de un depurador (en resumen, una consola IPython normal que permite inspeccionar y trazar variables en el punto de interrupción actual).

Ahora sobre tus puntos:

  1. Es verdad. Estamos pensando en mejorar eso para que si el usuario presiona el botón Ejecutar y hay un punto de interrupción presente en el archivo actual, Spyder ingresa en modo de depuración y ejecuta el programa hasta que se alcanza el primer punto de interrupción.

  2. ipdb es la consola de depuración de IPython. Desafortunadamente, debido a las limitaciones en la arquitectura de IPython, es muy limitado (no se completa el código ni se navega por el historial con flechas). Además, no es posible ejecutar código arbitrario de Python en ipdb o en una consola pdb normal. Los comandos que puede ejecutar en ipdb son los que puede leer cuando evalúa el comando de help ipdb .

  3. Eso es porque, como dije, no puedes evaluar el código arbitrario de Python.

  4. Debe colocar nuevos puntos de interrupción en nuestro Editor para que se sincronicen con nuestras consolas Python / IPython


Al parecer, nadie ha mencionado sobre estos dos antes:

Antes de Python, estaba usando VBA. Aunque es un lenguaje relativamente antiguo que no se actualiza regularmente, una cosa que me encantó de VBA fue la función de depuración. Las 2 funciones de depuración más cercanas a VBA o que también pueden denominarse "depuración visual" que he encontrado son:

1-PyCharm Debugger

This video de 6 minutos muestra el depurador PyCharm.

2-PixieDebugger: el depurador de Visual Python para portátiles Jupyter que siempre has deseado

Dado que muchos codificadores tienden a usar JupyterNotebook, este depurador sería útil. PixieDebugger es casi lo mismo que el depurador PyCharm. No entraré en detalles aquí.

Pero puedes referirte a este link


Así es como depuro en Spyder para evitar congelar el IDE. Hago esto si modifico el script mientras estoy en modo de depuración.

  1. Cierro la consola actual de IPython (depuración) [x]
  2. Abra una nueva [Barra de menú-> Consolas-> Abrir una consola IPython]
  3. Ingrese nuevamente al modo de depuración [botón de pausa de reproducción azul].

Todavía es un poco molesto, pero tiene el beneficio adicional de borrar (restablecer) la lista de variables.



Puede usar las teclas de método abreviado de depuración como: Pasar por encima de F10 Pasar a F11 en herramientas> preferencias> métodos abreviados de teclado


Un pequeño extra con respecto al punto 3:

También me pareció que la consola de depuración se congelaba con frecuencia, hacía impresiones, evaluaba, etc., pero al presionar el botón de detención (Salir de depuración) generalmente volvía al final de la pila de llamadas y luego podía volver a subir (''u'') al marco en el que estaba depurando. Vale la pena intentarlo. Esto podría ser para una versión posterior de Spyder (2.3.5.2)