Ipython: "Exécuter tout" dans le bloc-notes se bloque sur %matplotlib qt

Créé le 16 avr. 2014  ·  39Commentaires  ·  Source: ipython/ipython

C'est un bug étrange, mais il semble reproductible sur tous les systèmes.

Si j'ai un cahier où se trouve la première cellule

%matplotlib qt

Et je sélectionne "Exécuter tout", IPython exécute la première cellule mais se bloque ensuite. L'icône d'état dans le coin supérieur droit est un cercle ouvert, mais je ne peux pas exécuter d'autres cellules. Si j'ajoute une simple instruction print après la ligne %matplotlib , elle est exécutée et imprimée dans la zone de sortie.

Cela ne se produit pas si j'exécute la cellule "manuellement". Une fois que cela est arrivé, je peux sélectionner "Exécuter tout" sans problème.

Cela se produit avec IPyhton 2.0 sur OSX 10.6 et 10.8. J'utilise Python 2.7, via anaconda.

Heureux d'essayer quoi que ce soit pour traquer cela plus loin...

bug matplotlib

Commentaire le plus utile

Le problème se produit également avec la magie %gui qt , bien que je pense que cela essaie d'importer matplotlib dans certaines circonstances, donc je ne suis pas sûr.

Tous les 39 commentaires

Je remarque une chose similaire avec une installation Python 2.7 de miniconda sur Windows. Quand j'ai un cahier où la première cellule est :

%pylab

"Exécuter tout" se bloquera toujours même après avoir exécuté manuellement cette cellule particulière seule. Après cela, je dois Kernel->Redémarrer pour que le bloc-notes réponde à quoi que ce soit. Ma solution de contournement consiste à exécuter cette cellule manuellement par elle-même, à passer à la cellule suivante, puis à "Exécuter tout en dessous".

Je suis également heureux de fournir plus d'informations pour aider à traquer cela plus loin.

Je peux également le confirmer (et c'est plutôt ennuyeux si vous avez une première cellule avec à la fois %matplotlib et quelques importations (qui prennent un certain temps à s'exécuter), et que vous souhaitez l'exécuter avec les cellules suivantes).

Un moyen simple de reproduire ceci :

  1. Un cahier avec deux cellules :

%matplotlib import time time.sleep(10)

print "This will not print"

  1. Exécutez les deux à la fois (appuyez deux fois sur Shift-Enter)
  2. La première cellule s'exécutera, mais le noyau se bloque (la deuxième cellule n'est pas exécutée, vous ne pouvez rien exécuter, bien que l'indicateur indique que le noyau est prêt).

untitled

Ce n'est donc pas nécessairement lié à "Exécuter tout", mais simplement à l'exécution de plusieurs cellules où une cellule a %matplotlib .

Testé pour la dernière fois avec IPython 2.1, Windows 64 bits, Firefox 31

Après un peu plus d'expérimentation, j'ai découvert que ce problème se présentait pour moi pour la première fois dans la version 2.0.0. Si je reviens à la version 1.2.1 avec

conda install ipython=1.2.1

le problème s'en va.

Windows 32 bits, python 2.7.7, Firefox 31

J'ai également rencontré ce bogue et je peux reproduire en utilisant la méthode ci-dessus en utilisant Python 3.4.1, Anaconda 2.1.0 (64 bits) sur Windows 8, IPython 2.3.1
C'est un bug assez ennuyeux. Y a-t-il quelque chose que je puisse faire pour aider à le retrouver ? Quand le jalon 4.0 devrait-il (environ) être terminé ?

Je confirme le bogue en utilisant la version récente d'ipython de github (e2778c5f4047d03f5f025bd53d1704a0cf9f0337) sur Linux Mint 17, python 3.4 et matplotlib 1.4.0.

Des nouvelles de ces gars ? Je peux faire plus de tests si besoin. Ce bug est vraiment agaçant !!!

Je peux confirmer que cela m'arrive également, se produit tout le temps sur CentOS avec python 2.7 et matplotlib 1.4.4

Cela fonctionne-t-il si vous exécutez la cellule manuellement ?

Voir mon commentaire ci-dessus (https://github.com/ipython/ipython/issues/5629#issuecomment-50603511), il apparaît également si vous exécutez plusieurs cellules manuellement

Oui - c'est essentiellement une question de timing, je crois. Si vous Shift+Enter exécutez la cellule, puis attendez une seconde, puis continuez avec les autres, alors cela fonctionne. Si vous appuyez plusieurs fois sur Maj+Entrée, il se bloque. L'exécution d'autres cellules n'entraîne l'exécution d'aucun code (le petit cercle en haut à droite est toujours vide).

^ c'est aussi ce que j'ai observé.

Vérifié dans Ipython Notebook 3.1.0. Solution de contournement:

import time
%matplotlib
time.sleep(1)

Moche, mais c'est trop ennuyeux de renoncer à l'option de tout exécuter.

J'ai aussi fait en sorte que cela fonctionne sur ma machine.

Le vendredi 12 juin 2015 à 7 h 02, quicknir [email protected] a écrit :

Vérifié dans Ipython Notebook 3.1.0. Solution de contournement:

heure d'importation
%matplotlib
heure.sommeil(1)

Moche, mais c'est trop ennuyeux de renoncer à l'option de tout exécuter.

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/ipython/ipython/issues/5629#issuecomment-111502934 .

pourrions-nous obtenir ce jalon pour 4.1 (ou 5.0) ?
Accrocher des cahiers semble (pour moi) un peu plus sévère qu'approprié pour une étape importante de la liste de souhaits. De plus, ce bogue est gênant lors de l'utilisation de matplotlib (malgré la solution de contournement).

Devrions-nous simplement avoir un sleep(1) dans la magie matplotlib elle-même comme solution de contournement jusqu'à ce que nous comprenions pourquoi ??

:+1:

La solution de contournement du sommeil fonctionne rarement pour moi. Je l'ai vu fonctionner plusieurs fois, mais la grande majorité des fois où je l'ai essayé, le portable se bloque toujours.

La seule solution de contournement qui fonctionne toujours pour moi est de :

  1. Exécutez manuellement la cellule contenant %matplotlib
  2. Attendez l'indication d'inactivité du noyau
  3. sélectionnez la cellule suivante
  4. "Exécuter tout ci-dessous"

FWIW J'ai essayé de tester un peu cela pour obtenir une estimation plus raisonnable de la façon dont cela fonctionne.

J'ai fait un cahier avec les trois cellules suivantes :

import time
%matplotlib qt
time.sleep(1)
with open("test_log.txt", "a") as fid:
    fid.write("it worked\n")

puis dans le shell a couru:

for i in {1..100}; do
    ipython nbconvert --execute test_qt.ipynb  --inplace;
done
wc -l test_log.txt

Peut-être que ce test n'exerce pas le bon code, mais il semble fonctionner correctement.

Marqué comme 4.1 donc nous le regardons.

Merci.
Je viens d'essayer la reproduction de @mwaskom , et j'ai obtenu les mêmes résultats. Cependant, j'ai ensuite extrait le code de l'heure et du sommeil, et j'ai réexécuté la partie shell, et cela a _également_ fonctionné ! Donc, cela ne semble pas être une bonne procédure de reproduction (ou une solution de contournement interne). :-/
J'ai également découvert, comme @tanderl , que la solution de contournement du sommeil ne fonctionnait pas toujours pour moi. C'est sur ipython 3.2.1 sur Ubuntu 64 bits. Je peux essayer la même chose sur Windows demain.

Sous Windows 8.1, en utilisant Ipython 3.2.0 installé via Anaconda, j'ai également constaté que la solution de contournement du sommeil ne fonctionnait pas pour moi, c'est-à-dire avec sleep(1) (ou des valeurs encore plus grandes) dans la même cellule que la magie matplotlib, Run Tout sur un noyau fraîchement redémarré restera bloqué (ou ne fera rien, l'interface utilisateur fonctionne toujours), avec une étoile sur la cellule suivante. L'exécution manuelle des cellules une par une, avec une attente entre les deux, fonctionne toujours.

Je confirme ce que @bilderbuchi a dit avec une mise à jour des piles d'anaconda sur Linux Mint.

Salut,
Je viens de rencontrer un problème similaire. Lors de l'exécution de blocs-notes qui utilisent %matplotlib en ligne ou des magies de bloc-notes, le message "Exécuter toutes les cellules" se bloque parfois et je dois exécuter toutes les cellules à la main.
J'utilise Windows 7, Python 3.5, IPython 5.1.0, notebook 4.1.0 et matplotlib 1.5.3.
Pour contourner le problème, je nettoie toutes les sorties et cela semble fonctionner. Je ne suis malheureusement pas en mesure de fournir un cahier reproductible (cela fera l'affaire si je tombe dessus à l'avenir).

Meilleures salutations,
Florian

Ceci est toujours en cause, à la fois dans le cahier jupyter et dans le laboratoire.

@thomasaarholt avez-vous une procédure de reproduction fiable ?

@bilderbuchi voir le post original dans ce numéro, c'est toujours le même problème. Voici un GIF de moi en train de recréer cela sur ma machine (OSX avec les derniers jupyter et qt4)

bug

@Carreau , est-ce que ce repro est suffisant pour travailler avec ? Un bug suspendu devrait-il être plus urgent qu'une "liste de souhaits" ?

@bilderbuchi @Carreau , je viens de repérer la balise wish list.
J'aimerais faire valoir que ce bogue devrait être beaucoup plus prioritaire :

De nombreux nouveaux utilisateurs de jupyter apprendront à utiliser jupyter en utilisant des blocs-notes préexistants. Par exemple, ils essaient d'exécuter un exemple de classeur fourni par un plugin. Avec le comportement actuel, les utilisateurs utilisant la commande Exécuter tout ou "Maj + Entrée" en passant rapidement par le bloc-notes constateront que le bloc-notes se bloque dès le premier instant, ce qui donne une très mauvaise première impression. Une telle impression peut souvent vraiment souligner à quel point "le codage est compliqué" pour quelqu'un qui apprend le codage pour la première fois, ou quelqu'un qui a eu une mauvaise expérience (cours/examen) dans le passé.

J'aimerais faire valoir que ce bogue devrait être beaucoup plus prioritaire :

Eh bien, ce n'est plus une question de priorité, le bogue est ouvert depuis plus de 2 ans maintenant, et le problème est que personne ne peut le comprendre. Nous avons essayé de comprendre cela, mais cela semble être une solution insaisissable, et nous ne pouvons pas être des experts sur toutes les boucles d'événements et bibliothèques du framework. Nous serions heureux de faire quelque chose, mais le problème persiste depuis si longtemps que le marquer comme une priorité plus élevée n'aidera pas. Aucun des développeurs ne sait ce qui se passe. Sinon, nous l'aurions réparé.

@Carreau Pouvez-vous m'indiquer où dans le code ipython l'intégration entre le serveur du noyau et l'interface graphique devrait se produire?

Existe-t-il un moyen d'ouvrir un bloc-notes par programme dans un navigateur et d'exécuter toutes les cellules ? Cela nous permettrait probablement de diviser le code en deux pour déterminer quel changement provoque cela.
J'ai essayé d'exécuter le bloc-notes incriminé via nbconvert --execute partir du terminal et à partir d'une session IPython, mais je n'ai pas pu le faire se bloquer jusqu'à présent.

@bilderbuchi Tout d'abord, êtes-vous capable de reproduire le bug "à la main" sur votre machine ?

Oui. J'ai trouvé un comportement intéressant en essayant différentes variantes de la magie
Contenu de la première cellule :

%matplotlib notebook -> works
%matplotlib inline -> works
%matplotlib -> prints Using matplotlib backend: Qt5Agg, then hangs
%matplotlib qt -> prints ModuleNotFoundError: No module named 'PyQt4' (I think that's a different unrelated bug)
%matplotlib qt5 -> prints nothing, then hangs

(Le bug différent lorsque vous faites %matplotlib qt est ContinuumIO/anaconda-issues#1068 je pense.)
La deuxième cellule n'a que

print("This will not print")

Si j'ai dit "se bloque" ci-dessus, je veux dire que la deuxième cellule a toujours une étoile dans le numéro au lieu de "2", et le message n'est jamais imprimé.
Tout cela a été exécuté avec Kernel - Restart & Run All pour assurer une table rase. C'est sur Python 3.6.1 via Anaconda sur Windows 10, IPython 5.3.0, Firefox 52.0.2.

Pouvez-vous m'indiquer où dans le code ipython l'intégration entre le serveur du noyau et l'interface graphique devrait se produire ?

Il y a une description de la façon dont l'intégration de la boucle d'événement est censée fonctionner ici : http://ipython.readthedocs.io/en/stable/config/eventloops.html#event -loops-in-the-kernel

Et le code de la boucle d'événements Qt 5 commence ici : https://github.com/ipython/ipykernel/blob/20426cdad71820642dc69b95c30565d155521509/ipykernel/eventloops.py#L89

Juste pour vérifier - le problème est-il définitivement avec la partie "matplotlib" de %matplotlib et pas avec la magie en général ? Juste au cas où les autres magies prennent moins de temps à s'exécuter, et donc le bogue est moins perceptible.

Le problème se produit également avec la magie %gui qt , bien que je pense que cela essaie d'importer matplotlib dans certaines circonstances, donc je ne suis pas sûr.

Cela n'a rien (directement) à voir avec matplotlib ou magics. C'est presque certainement une condition de course lors du transfert d'une boucle d'événement à l'autre.

Je suppose qu'un correctif similaire à https://github.com/ipython/ipython/pull/10301/files est ce qui est nécessaire ici.

J'ai rencontré un problème similaire après la mise à jour de Spyder

Je peux confirmer que cela se produit toujours avec %gui qt. J'ai un tas de trucs Qt que j'appelle depuis des cahiers et dans ces cahiers, je dois exécuter ma première cellule manuellement, attendre qu'elle se termine, puis Exécuter tout en dessous.

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