Spyder: No se pueden ver los diagramas realizados con Matplotlib durante la depuración

Creado en 17 feb. 2015  ·  47Comentarios  ·  Fuente: spyder-ide/spyder

_De al.dan ... @ gmail.com el 2011-04-12T17: 33: 50Z_

Este script, cuando se ejecuta dentro de spyder, funciona bien y produce un gráfico de contorno:

#! / usr / bin / env python
de matplotlib.pyplot importar imshow, mostrar
importar numpy como np
x = np.random.rand (4,5)
imshow (x)
show()

Sin embargo, si entro al modo de depuración y pongo un punto de interrupción en la línea imshow (x), luego escribo manualmente los comandos imshow (x) y show () en el indicador (Pdb), no aparece ningún gráfico. Solo obtengo una referencia al objeto de la trama:

(Pdb) imshow (x)

(Pdb) mostrar ()
(Pdb)

Sería una buena mejora poder trazar variables en modo de depuración.

Python 2.7.1
NumPy 1.5.1
matplotlib 1.0.1 (backend de WXAgg)
RHEL 4.8 x86_64

_Edición original: http://code.google.com/p/spyderlib/issues/detail?id=620_

11–20 stars Debugger Bug

Comentario más útil

Consulte https://github.com/matplotlib/matplotlib/pull/4779 para conocer los detalles sangrientos.

La versión muy corta, para que la GUI responda, su bucle de eventos (que es esencialmente un bucle infinito esperando en la E / S del usuario) debe estar ejecutándose. El indicador de depuración también está en bucle infinito esperando que el usuario escriba. En el indicador 'normal' se realiza un delicado trabajo de integración para permitir que estos dos bucles se compartan (básicamente, el indicador permite que el bucle de la GUI se ejecute hasta que se presione una sola tecla, procese las claves y luego reinicie el bucle de eventos de la GUI). En el indicador de depuración, esta integración no se realiza y la figura parece "muerta". Esto afectará a cualquier ventana basada en GUI.

La razón por la que la llamada a plt.pause() funciona es que ejecuta explícitamente el ciclo de eventos de la GUI durante el número de segundos especificado.

El backend en línea funciona porque solo produce un png estático (por lo que _siempre_ está 'muerto').

Todos 47 comentarios

_De al.dan ... @ gmail.com el 2011-04-12T15: 40: 57Z_

Olvidé agregar que esto es con spyder 2.0.8 e ipython 0.10.1.
Además, el backend cuando se ejecuta Spyder es Qt4Agg. Obtengo WXAgg cuando ejecuto ipython directamente desde una ventana de terminal (es decir, independientemente de spyder).

_Desde ccordoba12 el 2011-05-15T19: 31: 44Z_

Etiquetas: Cat-Debugger

_Desde ccordoba12 el 2011-08-16T11: 41: 02Z_

el número 733 se ha fusionado con este problema.

_De eigenjoh ... @ gmail.com el 2011-11-10T07: 23: 21Z_

esta solución haría de esta aplicación un asesino de matlab

_De kavaldj ... @ gmail.com el 2013-05-12T21: 43: 03Z_

¿Esto se ha solucionado o abordado de alguna manera?

Estoy de acuerdo con el comentario #4 : esto acercaría a Spyder a un asesino de ML

_De contrebasse el 2013-05-13T00: 37: 52Z_

1: esto es normal, el backend defalut para matplotlib es WXAgg. Puedes cambiarlo en tu script:

importar matplotlib
matplotlib.use ('Qt4Agg', warn = False)

_De jed.lud ... @ gmail.com el 2013-05-13T07: 45: 45Z_

Diagnósticos recientes adicionales después de hacer un poco más de pruebas:

  • El trazado falla durante la depuración dentro de Spyder cuando el script se ejecuta dentro de la sesión interactiva actual de Python o la sesión interactiva de IPython. Esto es cierto para los backends Qt4Agg o WXAgg.
  • El trazado durante la depuración funciona bien dentro de Spyder si el script está configurado para ejecutarse en su propio intérprete de Python dedicado. Esto también es independiente del backend.
  • El trazado durante la depuración funciona bien desde una sesión de "ipython qtconsole" cuando se ejecuta en una consola del sistema.

Soyder 2.3.0dev (revisión 0bb65fdb4b6e)
Python 2.7.3 de 32 bits
IPython 0.13.2
Matplotlib 1.2.0
Windows 7 (64 bits)

_De kavaldj ... @ gmail.com el 2013-05-14T13: 45: 31Z_

8 Jed, gracias !!

Ejecutar depuración en un intérprete dedicado me funciona, ¡gracias por la gran pista!

Pido disculpas si parezco codicioso, pero ¿hay alguna forma sencilla de hacer que la figura no sea modal?

En este momento bloquea el intérprete cuando está detenido en Pdb, ¿puede haber otro truco que pueda usar? Solo estoy llamando a imshow (data), show ().

¡Muchas gracias de antemano!
dan

_De jed.lud ... @ gmail.com el 2013-05-14T16: 55: 16Z_

@ -kavaldijiev: Hacer que la figura no sea modal es la pieza difícil de resolver. Parece que Carlos buscó resolver esto en el problema # 733, y puede que no sea sencillo sin un trabajo interesante en el hilo. Probablemente tenga algo que ver con que el modo interactivo de matplotlib se ejecute en paralelo con pdb, y tendrías que averiguar cómo hacer que esos subprocesos cooperen.

Tenga en cuenta que si está intentando trazar durante la depuración en la consola IPython Qt, también se bloquea después de ejecutar el comando "show ()". Allí tampoco es completamente interactivo.

Ejecutar en un intérprete dedicado parece la mejor solución por ahora.

_De kavaldj ... @ gmail.com el 2013-05-15T14: 54: 57Z_

@ -jed ¡Gracias por la explicación detallada!

Me las arreglaré con figuras modales. Pero definitivamente vale la pena hacerlo funcionar a largo plazo, podría ser extremadamente atractivo para el público de MATLAB.

_De jed.lud ... @ gmail.com el 2013-05-16T07: 57: 29Z_

@ -kavaldijiev: Después de investigar un poco más, hay otra solución que debería proporcionarle una forma de trazar interactivamente durante la depuración. Parece que probablemente sean los componentes de la GUI de Qt los que se interponen en el trazado interactivo. Si ejecuta IPython _sin_ la interfaz de la consola Qt, el trazado interactivo funciona mientras se depura _sin_ bloqueo. Aquí están los comandos:

  1. Abra un símbolo del sistema y vaya al directorio donde se encuentra su script.
  2. Ejecute "ipython --pylab" cuando se le solicite.
  3. Dentro de IPython, ejecute "% run -d.py "
  4. Ahora debería poder recorrer el código usando comandos pdb, trazar usando imshow (), y el gráfico debería trazarse sin bloquear la entrada de la línea de comandos.

_De jed.lud ... @ gmail.com el 2013-05-16T15: 11: 32Z_

Y, después de investigar un poco más, encontré esta respuesta: http://stackoverflow.com/questions/12822762/pylab-ion-in-python-2-matplotlib-1-1-1-and-updating-of-the -plot-while-the-pro / 12826273 # 12826273 Entonces, si el código en la publicación original se modifica de esta manera:

desde matplotlib.pyplot importar imshow, pausar
importar numpy como np
x = np.random.rand (4,5)
imshow (x)
pausa (1)

¡Puede hacer que la trama se actualice, de forma interactiva, dentro de una consola interactiva de Spyder durante la depuración sin bloquear! Entonces, use pause (1) en lugar de show (). El gráfico solo se vuelve interactivo durante la duración de la pausa, por lo que si desea más tiempo para ampliar o desplazar los datos, use pausa (10) o pausa (20). También funciona en la consola IPython Qt.

_De kavaldj ... @ gmail.com el 2013-05-16T22: 35: 04Z_

@ -jed, gracias, ¡ambos métodos funcionan!

El método del símbolo del sistema parece más sólido: puedo cerrar las figuras abiertas y las figuras pueden enfocarse (para zoom, etc.) hasta que se cierren.

El método de pausa es obviamente preferible ya que está dentro de Spyder. La pausa devuelve el control del teclado, pero la ventana no debe cerrarse, de lo contrario, el intérprete se queda colgado. Abrir más figuras nuevas es inestable: a veces funciona, otras no, pero no dediqué mucho tiempo a probar.

En cualquier caso, cualquiera de ellos es extremadamente útil para depurar, incluso no tan fácil y robusto como ML.

Salud,
dan

_De al.dan ... @ gmail.com el 2013-05-19T21: 08: 30Z_

Me alegra ver el progreso después de un par de años. Sí, el truco de pausa (n) funciona bien para mí. ¡Gracias, @ -jed, por seguir adelante con una solución!

_De jed.lud ... @ gmail.com el 2013-05-20T09: 13: 28Z_

No puedo atribuirme mucho mérito a nada más que a la investigación. La función pause (n) es una característica de matplotlib que descubrí.

En última instancia, la raíz de este problema es realmente la interacción entre los bucles de eventos de dibujo de matplotlib y los bucles de eventos de la aplicación Qt, y no estoy seguro de que exista realmente una solución "Spyder". Probablemente deba abordarse a nivel de matplotlib. Como prueba de ello, IPython que se ejecuta en consolas Qt sufre estas mismas limitaciones.

_De jason.bo ... @ gmail.com el 2014-07-07T05: 33: 04Z_

Este problema parece haberse resuelto en IEP: https://bitbucket.org/iep-project/iep/issue/297/interactive-plotting-is-not-working-during

_Desde ccordoba12 el 2014-07-07T07: 53: 08Z_

El número 1848 se ha fusionado con este número.

Solo me preguntaba si alguien podría darme una pequeña perspectiva de hacia dónde nos dirigimos con todo esto. Sospecho que no soy el único que ha pasado mucho tiempo usando Matlab y se siente muy atraído por el mundo de Python por varias razones y percibe que la verdadera productividad está casi tan cerca, pero como un espejismo parece estar siempre fuera de lugar. de alcance. La solución de pause () es excelente y la capacidad de respuesta del equipo de Spyder es realmente impresionante. Y ahora que el problema del editor lento en El Capitán aparentemente ha desaparecido en la versión 3.0 beta, todo parece _ tan cerca_. Y todavía ...

Entonces, ¿hacia dónde cree un experto que se dirige todo esto? Por lo que puedo deducir, una gran parte del problema es el propio Matplotlib. Y también deduzco que guiqwt tampoco está muy bien en este momento. Entonces, ¿la gente piensa que nos dirigimos hacia una situación en la que podemos depurar en un IDE, alcanzar puntos de interrupción y realizar un trazado interactivo desde los puntos de interrupción, todo sin problemas? Creo que eso es lo que todos los ex usuarios de Matlab quieren, y algunos de nosotros nos preguntamos si deberíamos aportar los $ 200 para Matlab Home Edition, volver a The Borg y alejarnos del enfoque de Python y el atractivo del software basado en la comunidad y el Lenguaje Python.

Puede parecer que me estoy quejando, pero en realidad estoy tratando de averiguar cómo invertir mi tiempo. Realmente quiero que Python sea el asesino de Matlab que podría ser ...

@jandyman , no desesperes :-) Hemos estado haciendo una reorganización / limpieza masiva para Spyder 3.0 que sería muy beneficiosa para Spyder 4.0, donde planeamos resolver este problema.

El verdadero problema no es con Matplotlib, es con la arquitectura IPython / Jupyter que bloquea la consola durante la depuración, lo que nos impide ejecutar una sesión de depuración más destacada (con exploración del historial y gráficos) como en Matlab.

Pero déjeme asegurarle que después del lanzamiento de 3.0 (en aproximadamente un mes), todos nuestros esfuerzos se dirigirán a resolver los muchos problemas de depuración pendientes y muy desagradables que tiene Spyder. Si todo va bien y tenemos éxito, planeamos lanzar nuestras correcciones en 4.0 (como dije) para fin de año, o principios del próximo :-)

También deduzco que guiqwt tampoco está muy bien en este momento.

Ese es un proyecto de @PierreRaybaut (el mismo que creó Spyder). Desafortunadamente, últimamente no tiene mucho tiempo para el código abierto :-(

También deduzco que guiqwt tampoco está muy bien en este momento.

Ese es un proyecto de @PierreRaybaut (el mismo que creó Spyder). Desafortunadamente, últimamente no tiene mucho tiempo para el código abierto :-(

@ ccordoba12 , @jandyman : Eso es, lamentablemente.
Sin embargo, recientemente hice un trabajo significativo en guiqwt: resolví el problema de obsolescencia de PyQwt volviéndolo a implementar en Python puro (ver el proyecto PythonQwt ) para que guiqwt v3 ya no dependa de PyQwt. No creo que guiqwt esté en mal estado en este momento: gracias a los desarrollos recientes, funciona en Python 2.7, 3.0-3.5 y con Qt4-Qt5. Pero el proyecto no está creciendo, porque no tengo tiempo para administrarlo (es decir, crear nuevas funciones, promocionar la biblioteca, etc.). Solo estoy haciendo mantenimiento, para que las funciones actuales sigan funcionando como antes. Tal como está, tenga en cuenta que todavía es mucho, mucho más eficaz que matplotlib (o MATLAB) para mostrar y manipular imágenes grandes en tiempo real (zomming / paneo, ajustar el contraste, trazar secciones transversales, etc.) por ejemplo, y es un muy por delante matplotlib en cuanto a interactividad.

Con respecto a la publicación original de @ ccordoba12 , Spyder ahora confía en IPython / Jupyter: esto es una gran cosa, ya que habilitó muchas características nuevas, pero también tiene sus inconvenientes.
De todos modos, no veo por qué no podría ser posible interactuar de la misma manera en Spyder que en MATLAB.

Hola a todos,

Soy uno de los usuarios que ha cambiado de MATLAB a Python. Creo que Spyder es un gran IDE, pero el problema de la falta de trazado interactivo durante la depuración es un inconveniente importante para las personas que proviene de MATLAB.

Creo que no debería ser tan difícil resolverlo. Por ejemplo, estoy ejecutando IPython desde una terminal del sistema (no qtConsole) y puedo hacer un trazado interactivo (guiqwt) sin problemas, ya sea desde sesiones de IPython o ipdb. Además, tengo un historial de comandos mientras depuro. Creo que si simplemente reemplaza (o agrega la opción) de ejecutar ipython desde una terminal (no qtConsole), este problema se resolverá.

Por favor, intente arreglar esto, ya que creo que esto es lo único que impide que mucha gente use Spyder.

Gracias,

Felipe

Creo que no debería ser tan difícil resolverlo.

Es. Las bibliotecas y tecnologías utilizadas por IPython en la terminal y qtconsole son completamente diferentes.

No por nada este error lleva 5 años abierto, y aún lo estará por más tiempo ;-)

Necesito esta función porque uso Spyder como el IDE principal para desarrollar algoritmos de procesamiento de imágenes, ver las imágenes mientras se depuran es una solicitud de función muy común.

A mí también me gustaría, uso Spyder principalmente para depurar.

@mmagnuski , esto es posible ahora mismo usando la magia %plot durante la depuración, así

%plot plt.plot(range(10))

Pero para que esto funcione, debe configurar su backend de Matplotlib en Inline .

@tacaswell Estaba teniendo una conversación con @WeatherGod y pensó que podrías ser capaz de intervenir.

Sería genial si esto funcionara "sin problemas", aunque entiendo que es difícil.

Por ahora, uso el truco pause(10) .

Consulte https://github.com/matplotlib/matplotlib/pull/4779 para conocer los detalles sangrientos.

La versión muy corta, para que la GUI responda, su bucle de eventos (que es esencialmente un bucle infinito esperando en la E / S del usuario) debe estar ejecutándose. El indicador de depuración también está en bucle infinito esperando que el usuario escriba. En el indicador 'normal' se realiza un delicado trabajo de integración para permitir que estos dos bucles se compartan (básicamente, el indicador permite que el bucle de la GUI se ejecute hasta que se presione una sola tecla, procese las claves y luego reinicie el bucle de eventos de la GUI). En el indicador de depuración, esta integración no se realiza y la figura parece "muerta". Esto afectará a cualquier ventana basada en GUI.

La razón por la que la llamada a plt.pause() funciona es que ejecuta explícitamente el ciclo de eventos de la GUI durante el número de segundos especificado.

El backend en línea funciona porque solo produce un png estático (por lo que _siempre_ está 'muerto').

¡Gracias por la explicación y el problema vinculado Thomas!

Este PR lo resolvería, creo: https://github.com/ipython/ipykernel/pull/438

¡Buen trabajo! ¡Muchas gracias @ impact27!

¿Alguna solución para esto? No puedo cerrar la figura después de plt.pause (1). Intenté plt.close () y pause nuevamente pero n éxito. Gracias

¿Alguna solución para esto? No puedo cerrar la figura después de plt.pause (1). Intenté plt.close () y pause nuevamente pero n éxito. Gracias

Tienes que dar el número de figura como argumento para plt.close() (o 'all' ). La solución por ahora es plt.pause . Se resolverá cuando / si ipykernel se fusiona https://github.com/ipython/ipykernel/pull/438. Yo personalmente uso una versión modificada de ipykernel con esta rama fusionada.

¿Alguna solución para esto? No puedo cerrar la figura después de plt.pause (1). Intenté plt.close () y pause nuevamente pero n éxito. Gracias

Tienes que dar el número de figura como argumento para plt.close() (o 'all' ). La solución por ahora es plt.pause . Se resolverá cuando / si ipykernel fusiona ipython / ipykernel # 438 . Yo personalmente uso una versión modificada de ipykernel con esta rama fusionada.

No funcionó. Ejecuto plt.figure (1); plt.imshow (myimage); plt.pause (1); plt.close (1) y no hay resultados. Estoy en IPython 7.11.1, Spyder 4.0.1 y python 3.7.5

Pude reproducirme. Abra una nueva edición sobre eso. Como solución alternativa, puede cerrarlos con la cruz mientras esté por debajo de plt.pause

Pude reproducirme. Abra una nueva edición sobre eso. Como solución alternativa, puede cerrarlos con la cruz mientras esté por debajo de plt.pause

Esta solución funcionó. Eso es raro. Gracias de cualquier manera

Esto no es solo un problema durante la depuración. Tengo el backend en línea activado. Aquí hay un ejemplo de trabajo mínimo:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.rand(2, 5)

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(x, y)

Si "Ejecutar archivo" en el ejemplo, aparece un gráfico en línea. Si selecciono la totalidad del ejemplo y "Ejecutar selección o línea actual", aparece un gráfico en línea. Si selecciono las líneas 1-6 y "Ejecutar selección o línea actual", y escribo el resto del ejemplo en la consola, no aparece ningún gráfico. Aparece la referencia al objeto de la trama.

Esto no es solo un problema durante la depuración. Tengo el backend en línea activado. Aquí hay un ejemplo de trabajo mínimo:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.rand(2, 5)

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(x, y)

Si "Ejecutar archivo" en el ejemplo, aparece un gráfico en línea. Si selecciono la totalidad del ejemplo y "Ejecutar selección o línea actual", aparece un gráfico en línea. Si selecciono las líneas 1-6 y "Ejecutar selección o línea actual", y escribo el resto del ejemplo en la consola, no aparece ningún gráfico. Aparece la referencia al objeto de la trama.

No creo que esto esté relacionado con este error. Esta es una limitación del uso del back-end en línea que la trama no "redibuja" por sí misma. Si necesita trazar explícitamente algo en el back-end en línea, puede hacer:

from IPython.core.display import display
display(fig)

display(fig) funciona. Aún así, el comportamiento inconsistente entre ejecutar completamente un archivo y ejecutar parcialmente un archivo y terminar en la consola es confuso.

@kdpenner : obtendrá el mismo comportamiento, por ejemplo, en el cuaderno si divide el código entre celdas, esto es lo esperado. Pero no creo que necesites usar la función display() para esto. Escribir fig en la consola debería dibujar la figura.

fig también funciona. Quizás esta diferencia de comportamientos fue diseñada, pero no es lo que yo, como usuario, espero.

@kdpenner Lo que quise decir es que obtendrás el mismo comportamiento en otros entornos con backend en línea, por lo que esto no es un problema con Spyder.

@mmagnuski Entendido. Gracias por la solución alternativa fig .

🎉

¡Muchas gracias por arreglar esto!

¡emocionante!

Puede leer sobre esto y las otras mejoras de nuestro depurador que aterrizó en la versión 4.2.0 aquí .

¿Fue útil esta página
0 / 5 - 0 calificaciones