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 enh
-
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:
-
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.
-
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 enipdb
o en una consolapdb
normal. Los comandos que puede ejecutar enipdb
son los que puede leer cuando evalúa el comando dehelp
ipdb
. -
Eso es porque, como dije, no puedes evaluar el código arbitrario de Python.
-
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.
- Cierro la consola actual de IPython (depuración) [x]
- Abra una nueva [Barra de menú-> Consolas-> Abrir una consola IPython]
- 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.
El depurador pdb funciona bien con Python normal . Entonces, en Spyder, solo cambio a la consola de Python cada vez que quiero depurar de forma interactiva.
import pdb
def yourfunction():
# Interesting stuff done here
pdb.set_trace()
Buena introducción a la depuración con pdb https://pythonconquerstheuniverse.wordpress.com/category/python-debugger/
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)