Spyder: Impossible de voir les tracés réalisés avec Matplotlib lors du débogage

Créé le 17 févr. 2015  ·  47Commentaires  ·  Source: spyder-ide/spyder

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

Ce script, lorsqu'il est exécuté dans spyder, fonctionne correctement et produit un tracé de contour:

#! / usr / bin / env python
depuis matplotlib.pyplot import imshow, show
importer numpy comme np
x = np.random.rand (4,5)
imshow (x)
spectacle()

Cependant, si j'entre en mode débogage et que je mets un point d'arrêt sur la ligne imshow (x), puis tapez manuellement les commandes imshow (x) et show () à l'invite (Pdb), aucun tracé n'apparaît. Je n'obtiens qu'une référence à l'objet de tracé:

(Pdb) imshow (x)

(Pdb) montrer ()
(Pdb)

Ce serait une belle amélioration pour pouvoir tracer des variables en mode débogage.

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

_Problème d'origine: http://code.google.com/p/spyderlib/issues/detail?id=620_

11–20 stars Debugger Bug

Commentaire le plus utile

Voir https://github.com/matplotlib/matplotlib/pull/4779 pour les détails sanglants.

La version très courte, pour que l'interface graphique soit réactive, sa boucle d'événements (qui est essentiellement une boucle infinie attendant les E / S de l'utilisateur) doit être en cours d'exécution. L'invite de débogage est également en boucle infinie en attente de saisie par l'utilisateur. À l'invite `` normale '', un travail d'intégration délicat est effectué pour permettre à ces deux boucles de se partager (en gros, l'invite permet à la boucle GUI de s'exécuter jusqu'à ce qu'une seule touche soit frappée, traite les touches, puis redémarre la boucle d'événement GUI). À l'invite de débogage, cette intégration n'est pas effectuée et le chiffre semble «mort». Cela affectera toute fenêtre basée sur l'interface graphique.

La raison pour laquelle l'appel de plt.pause() fonctionne est qu'il exécute explicitement la boucle d'événement GUI pendant le nombre de secondes donné.

Le backend en ligne fonctionne car il ne produit qu'un png statique (tout comme _always_ 'dead').

Tous les 47 commentaires

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

J'ai oublié d'ajouter que c'est avec spyder 2.0.8 et ipython 0.10.1.
De plus, le backend lorsque spyder s'exécute est Qt4Agg. J'obtiens WXAgg lorsque j'exécute ipython directement à partir d'une fenêtre de terminal (c'est-à-dire indépendamment de spyder).

_De ccordoba12 le 2011-05-15T19: 31: 44Z_

Libellés: Cat-Debugger

_De ccordoba12 le 2011-08-16T11: 41: 02Z_

le numéro 733 a été fusionné avec ce numéro.

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

ce correctif ferait de cette application un tueur matlab

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

Cela a-t-il été corrigé ou résolu d'une manière ou d'une autre?

Je suis d'accord avec le commentaire #4 : cela rapprocherait Spyder d'un tueur de ML

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

1: c'est normal, le backend defalut pour matplotlib est WXAgg. Vous pouvez le modifier dans votre script:

importer matplotlib
matplotlib.use ('Qt4Agg', warn = Faux)

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

Diagnostics récents supplémentaires après avoir effectué un peu plus de tests:

  • Le traçage échoue lors du débogage à l'intérieur de Spyder lorsque le script est exécuté dans la session Python interactive actuelle ou la session IPython interactive. Ceci est vrai pour les backends Qt4Agg ou WXAgg.
  • Le traçage pendant le débogage fonctionne bien dans Spyder si le script est configuré pour s'exécuter dans son propre interpréteur Python dédié. Ceci est également indépendant du backend.
  • Le traçage pendant le débogage fonctionne très bien à partir d'une session de «ipython qtconsole» lorsqu'il est exécuté dans une console système.

Soyder 2.3.0dev (révision 0bb65fdb4b6e)
Python 2.7.3 32 bits
IPython 0.13.2
Matplotlib 1.2.0
Windows 7 (64 bits)

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

8 Jed, merci !!

Lancer le débogage dans un interpréteur dédié fonctionne pour moi, merci pour le bon indice!

Je m'excuse si j'ai l'air gourmand, mais y a-t-il un moyen simple de rendre la figure non modale?

En ce moment, il bloque l'interpréteur car il est arrêté dans Pdb, peut-être y a-t-il une autre astuce que je peux utiliser? J'appelle juste imshow (data), show ().

Merci d'avance!
dan

_De jed.lud ... @ gmail.com le 14/05/2013T16: 55: 16Z_

@ -kavaldijiev: Rendre la figure non modale est la pièce difficile à résoudre. Il semble que Carlos a cherché à résoudre ce problème sous le problème # 733, et cela peut ne pas être simple sans un travail de thread intéressant. Cela a probablement quelque chose à voir avec le mode interactif de matplotlib devant fonctionner en parallèle avec pdb, et vous devrez trouver comment faire coopérer ces threads.

Notez que si vous essayez de tracer pendant le débogage dans la console IPython Qt, cela se bloque également après avoir émis la commande "show ()". Ce n'est pas complètement interactif non plus.

L'exécution dans un interpréteur dédié semble être la meilleure solution pour le moment.

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

@ -jed Merci pour l'explication détaillée!

Je me débrouillerai avec des chiffres modaux. Mais cela vaut vraiment la peine de le faire fonctionner à long terme, cela pourrait être extrêmement attrayant pour la foule MATLAB.

_De jed.lud ... @ gmail.com le 16/05/2013T07: 57: 29Z_

@ -kavaldijiev: Après un peu plus d'enquête, il existe une autre solution de contournement qui devrait vous fournir un moyen de tracer de manière interactive pendant le débogage. Il semble que ce soient probablement les composants de l'interface graphique Qt qui gênent le traçage interactif. Si vous exécutez IPython _sans_ l'interface de la console Qt, le traçage interactif fonctionne lors du débogage _sans_ blocage. Voici les commandes:

  1. Ouvrez une invite de commande et accédez au répertoire dans lequel se trouve votre script.
  2. Exécutez "ipython --pylab" à l'invite.
  3. Dans IPython, exécutez "% run -d.py "
  4. Vous devriez maintenant pouvoir parcourir le code en utilisant les commandes pdb, tracer en utilisant imshow (), et le tracé devrait être dessiné sans bloquer l'entrée de la ligne de commande.

_De jed.lud ... @ gmail.com le 16/05/2013T15: 11: 32Z_

Et, après un peu plus de recherche, j'ai trouvé cette réponse: http://stackoverflow.com/questions/12822762/pylab-ion-in-python-2-matplotlib-1-1-1-and-updating-of-the -plot-while-the-pro / 12826273 # 12826273 Donc, si le code de l'article d'origine est modifié de cette manière:

depuis matplotlib.pyplot import imshow, pause
importer numpy comme np
x = np.random.rand (4,5)
imshow (x)
pause (1)

vous pouvez mettre à jour le tracé, de manière interactive, à l'intérieur d'une console interactive Spyder pendant le débogage sans blocage! Donc, utilisez pause (1) au lieu de show (). Le tracé ne devient interactif que pendant la durée de la pause, donc si vous voulez plus de temps pour zoomer ou faire un panoramique dans les données, utilisez pause (10) ou pause (20). Fonctionne également dans la console IPython Qt.

_De kavaldj ... @ gmail.com le 16/05/2013T22: 35: 04Z_

@ -jed, merci, les deux méthodes fonctionnent!

La méthode d'invite de commande semble plus robuste - je peux fermer les chiffres ouverts et les chiffres peuvent obtenir le focus (pour le zoom, etc.) jusqu'à ce qu'ils soient fermés.

La méthode de pause est évidemment préférable car elle est dans Spyder. La pause renvoie le contrôle du clavier, mais la fenêtre ne doit pas être fermée, sinon l'interprète se bloque. L'ouverture de nouvelles figures est instable - parfois réussit, d'autres fois non, mais je n'ai pas passé beaucoup de temps à tester.

Dans tous les cas, l'un d'entre eux est extrêmement utile pour le débogage, même pas aussi simple et robuste que ML.

À votre santé,
dan

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

Heureux de voir des progrès après quelques années. Oui, l'astuce pause (n) fonctionne bien pour moi. Merci, @ -jed, d'avoir donné suite à une solution!

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

Je ne peux pas m'attribuer beaucoup de mérite pour autre chose qu'une enquête. La fonction pause (n) est une fonctionnalité matplotlib que je viens de découvrir.

En fin de compte, la racine de ce problème est vraiment l'interaction entre les boucles d'événements de dessin matplotlib et les boucles d'événements d'application Qt, et je ne suis pas sûr qu'il y ait vraiment une solution «Spyder» à cela. Il doit probablement être traité au niveau matplotlib. Pour preuve, IPython s'exécutant sur les consoles Qt souffre de ces mêmes limitations.

_De jason.bo ... @ gmail.com le 07/07/2014T05: 33: 04Z_

Ce problème semble avoir été résolu dans IEP: https://bitbucket.org/iep-project/iep/issue/297/interactive-plotting-is-not-working-during

_De ccordoba12 le 07/07/2014T07: 53: 08Z_

le problème # 1848 a été fusionné avec ce numéro.

Je me demandais simplement si quelqu'un pouvait me donner un petit aperçu de la direction que nous prenons avec tout cela. Je soupçonne que je ne suis pas le seul à avoir passé beaucoup de temps à utiliser Matlab et à être très attiré par le monde Python pour diverses raisons et sentir que la vraie productivité est terriblement proche, mais comme un mirage semble toujours être juste à l'extérieur de portée. La solution de contournement pause () est excellente et la réactivité de l'équipe Spyder est vraiment impressionnante. Et maintenant que le problème de la lenteur de l'éditeur dans El Capitan est apparemment éliminé dans la version bêta 3.0, tout semble si proche. Et encore ...

Alors, où un expert pense-t-il que tout cela va? D'après ce que je peux comprendre, une grande partie du problème est Matplotlib lui-même. Et je suppose également que guiqwt n'est pas non plus une excellente forme pour le moment. Alors, les gens pensent-ils que nous nous dirigeons vers une situation où nous pouvons déboguer dans un IDE, atteindre des points d'arrêt et faire un traçage interactif à partir des points d'arrêt, le tout de manière assez transparente? Je pense que c'est ce que veulent tous les anciens utilisateurs de Matlab, et certains d'entre nous se demandent si nous devrions poney jusqu'à 200 $ pour Matlab Home Edition, revenir à The Borg et s'éloigner de l'approche Python et de l'attrait des logiciels communautaires et du Langage Python.

Cela peut avoir l'air de me plaindre, mais j'essaie simplement de comprendre comment investir mon temps. Je veux vraiment que la manière Python soit le tueur de Matlab, cela pourrait être ...

@jandyman , ne désespérez pas :-) Nous avons fait une réorganisation / nettoyage massif pour Spyder 3.0 qui serait très bénéfique pour Spyder 4.0, où nous prévoyons de résoudre ce problème.

Le vrai problème n'est pas avec Matplotlib, c'est avec l'architecture IPython / Jupyter qui bloque la console lors du débogage, nous empêchant d'exécuter une session de débogage plus fonctionnelle (avec navigation dans l'historique et tracés) comme dans Matlab.

Mais laissez-moi vous assurer qu'après la sortie de la 3.0 (dans un mois environ), tous nos efforts seront dirigés pour résoudre les nombreux problèmes de débogage en suspens et très désagréables que Spyder a. Si tout se passe bien et que nous réussissons, nous prévoyons de publier nos correctifs en 4.0 (comme je l'ai dit) d'ici la fin de l'année, ou au début de la prochaine :-)

Je suppose également que guiqwt n'est pas non plus en forme pour le moment

C'est un projet @PierreRaybaut (le même qui a créé Spyder). Malheureusement, il n'a pas beaucoup de temps pour l'open source ces derniers temps :-(

Je suppose également que guiqwt n'est pas non plus en forme pour le moment

C'est un projet @PierreRaybaut (le même qui a créé Spyder). Malheureusement, il n'a pas beaucoup de temps pour l'open source ces derniers temps :-(

@ ccordoba12 , @jandyman : C'est vrai, malheureusement.
Cependant, j'ai récemment fait un travail important sur guiqwt: j'ai résolu le problème d'obsolescence de PyQwt en le réimplémentant en Python pur (voir le projet PythonQwt ) afin que guiqwt v3 ne repose plus sur PyQwt. Je ne pense pas que guiqwt soit en mauvais état pour le moment: grâce aux développements récents, il fonctionne sur Python 2.7, 3.0-3.5 et avec Qt4-Qt5. Mais le projet ne grandit pas, car je n'ai pas le temps de le gérer (c'est-à-dire créer de nouvelles fonctionnalités, promouvoir la bibliothèque, etc.) - je fais uniquement de la maintenance, pour que les fonctionnalités actuelles continuent à fonctionner comme avant. En l'état, notez qu'il est encore loin, bien plus performant que matplotlib (ou MATLAB) pour afficher et manipuler de grandes images en temps réel (zomming / panoramique, réglage du contraste, tracer des coupes transversales, etc.) par exemple, et c'est un bien avant matplotlib concernant l'interactivité.

En ce qui @jandyman , je ne peux pas penser qu'il n'y ait pas de solution pour utiliser Python / Spyder comme un bon remplacement pour MATLAB. Personnellement, en 2009, j'étais déjà capable de le faire et sans aucun compromis. Mais, la solution pour l'implémenter en 2009 ne s'applique plus à l'état actuel du code: à l'époque, Spyder s'appuyait sur un interpréteur Python "pur". Comme @ ccordoba12 l'a mentionné, Spyder s'appuie maintenant sur IPython / Jupyter: c'est une bonne chose car il a permis de nombreuses nouvelles fonctionnalités, mais il a aussi ses inconvénients.
Quoi qu'il en soit, je ne vois pas pourquoi il ne pourrait pas être possible d'interagir de la même manière dans Spyder que dans MATLAB.

Salut à tous,

Je fais partie des utilisateurs qui sont passés de MATLAB à Python. Je pense que Spyder est un excellent IDE, mais le problème de l'absence de traçage interactif lors du débogage est un inconvénient important pour les personnes qui viennent de MATLAB.

Je pense qu'il ne devrait pas être si difficile de le résoudre. Par exemple, j'exécute IPython à partir d'un terminal système (pas de qtConsole), et je peux faire un tracé interactif (guiqwt) parfaitement, soit à partir de sessions IPython ou ipdb. De plus, j'ai l'historique des commandes lors du débogage. Je pense que si vous remplacez simplement (ou ajoutez l'option) d'exécuter ipython à partir d'un terminal (pas de qtConsole), ce problème sera résolu.

S'il vous plaît, essayez de résoudre ce problème, car je pense que c'est la seule chose qui empêche beaucoup de gens d'utiliser Spyder.

Merci,

Felipe

Je pense qu'il ne devrait pas être si difficile de le résoudre.

Il est. Les bibliothèques et technologies utilisées par IPython dans le terminal et qtconsole sont complètement différentes.

Ce n'est pas pour rien que ce bogue est ouvert depuis 5 ans, et il le sera encore pour encore quelques temps ;-)

J'ai besoin de cette fonctionnalité car j'utilise Spyder comme IDE principal pour développer des algorithmes de traitement d'image, la visualisation des images pendant le débogage est une demande de fonctionnalité très courante.

Je l'aimerais aussi, j'utilise Spyder principalement pour le débogage.

@mmagnuski , c'est possible dès maintenant en utilisant la magie %plot lors du débogage, comme ceci

%plot plt.plot(range(10))

Mais pour que cela fonctionne, vous devez définir votre backend Matplotlib sur Inline .

@tacaswell J'avais une conversation avec @WeatherGod et il a pensé que vous pourriez peut-être intervenir.

Ce serait cool si cela fonctionnait "de manière transparente" même si je comprends que c'est difficile.

Pour l'instant, j'utilise l'astuce pause(10) .

Voir https://github.com/matplotlib/matplotlib/pull/4779 pour les détails sanglants.

La version très courte, pour que l'interface graphique soit réactive, sa boucle d'événements (qui est essentiellement une boucle infinie attendant les E / S de l'utilisateur) doit être en cours d'exécution. L'invite de débogage est également en boucle infinie en attente de saisie par l'utilisateur. À l'invite `` normale '', un travail d'intégration délicat est effectué pour permettre à ces deux boucles de se partager (en gros, l'invite permet à la boucle GUI de s'exécuter jusqu'à ce qu'une seule touche soit frappée, traite les touches, puis redémarre la boucle d'événement GUI). À l'invite de débogage, cette intégration n'est pas effectuée et le chiffre semble «mort». Cela affectera toute fenêtre basée sur l'interface graphique.

La raison pour laquelle l'appel de plt.pause() fonctionne est qu'il exécute explicitement la boucle d'événement GUI pendant le nombre de secondes donné.

Le backend en ligne fonctionne car il ne produit qu'un png statique (tout comme _always_ 'dead').

Merci pour l'explication et le problème lié Thomas!

Ce PR le résoudrait je pense: https://github.com/ipython/ipykernel/pull/438

Bon travail! Merci beaucoup @ impact27!

Une solution pour ça? Je ne peux pas fermer le chiffre après une pause plt (1). J'ai essayé plt.close () et une nouvelle pause, mais sans succès. Merci

Une solution pour ça? Je ne peux pas fermer le chiffre après une pause plt (1). J'ai essayé plt.close () et une nouvelle pause, mais sans succès. Merci

Vous devez donner le numéro de la figure comme argument à plt.close() (ou 'all' ). La solution pour l'instant est plt.pause . Il sera résolu lorsque / si ipykernel fusionne https://github.com/ipython/ipykernel/pull/438. J'utilise personnellement une version modifiée d'ipykernel avec cette branche fusionnée.

Une solution pour ça? Je ne peux pas fermer le chiffre après une pause plt (1). J'ai essayé plt.close () et une nouvelle pause, mais sans succès. Merci

Vous devez donner le numéro de la figure comme argument à plt.close() (ou 'all' ). La solution pour l'instant est plt.pause . Il sera résolu quand / si ipykernel fusionne ipython / ipykernel # 438 . J'utilise personnellement une version modifiée d'ipykernel avec cette branche fusionnée.

Ça n'a pas marché. Je lance plt.figure (1); plt.imshow (myimage); plt.pause (1); plt.close (1) et aucun résultat. Je suis sur IPython 7.11.1, Spyder 4.0.1 et python 3.7.5

J'ai pu me reproduire. Veuillez ouvrir un nouveau numéro à ce sujet. Pour contourner ce problème, vous pouvez les fermer avec la croix sous plt.pause

J'ai pu me reproduire. Veuillez ouvrir un nouveau numéro à ce sujet. Pour contourner ce problème, vous pouvez les fermer avec la croix sous plt.pause

Cette solution de contournement a fonctionné. C'est bizarre. Merci quand même

Ce n'est pas seulement un problème lors du débogage. J'ai le backend en ligne activé. Voici un exemple de travail minimal:

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 je "Exécuter le fichier" sur l'exemple, un tracé en ligne apparaît. Si je sélectionne l'intégralité de l'exemple et "Exécuter la sélection ou la ligne actuelle", un tracé en ligne apparaît. Si je sélectionne les lignes 1 à 6 et «Exécuter la sélection ou la ligne actuelle», et que je tape le reste de l'exemple dans la console, aucun tracé n'apparaît. La référence à l'objet de tracé apparaît.

Ce n'est pas seulement un problème lors du débogage. J'ai le backend en ligne activé. Voici un exemple de travail minimal:

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 je "Exécuter le fichier" sur l'exemple, un tracé en ligne apparaît. Si je sélectionne l'intégralité de l'exemple et "Exécuter la sélection ou la ligne actuelle", un tracé en ligne apparaît. Si je sélectionne les lignes 1 à 6 et «Exécuter la sélection ou la ligne actuelle», et que je tape le reste de l'exemple dans la console, aucun tracé n'apparaît. La référence à l'objet de tracé apparaît.

Je ne pense pas que cela soit lié à ce bug. Il s'agit d'une limitation de l'utilisation du back-end en ligne que le tracé ne se "redessine" pas. Si vous avez besoin de tracer explicitement quelque chose dans le back-end en ligne, vous pouvez faire:

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

display(fig) fonctionne. Pourtant, le comportement incohérent entre l'exécution complète d'un fichier et l'exécution partielle d'un fichier et la finition dans la console est déroutant.

@kdpenner - vous obtiendrez le même comportement par exemple dans notebook si vous divisez le code entre les cellules, c'est normal. Mais je ne pense pas que vous ayez besoin d'utiliser la fonction display() pour cela. Taper fig dans la console devrait dessiner le chiffre.

fig fonctionne aussi. Peut-être que cette différence de comportement a été conçue, mais ce n'est pas ce à quoi j'attends, en tant qu'utilisateur.

@kdpenner Ce que je voulais dire, c'est que vous obtiendrez le même comportement dans d'autres environnements avec un backend en ligne, donc ce n'est pas un problème avec Spyder.

@mmagnuski Compris. Merci pour la solution fig contournement

🎉

Merci beaucoup d'avoir résolu ce problème!

passionnant!

Vous pouvez lire à ce sujet et les autres améliorations apportées à notre débogueur qui ont atterri dans la version 4.2.0 ici .

Cette page vous a été utile?
0 / 5 - 0 notes