Readthedocs.org: Le backend Matplotlib devrait être forcé à Agg

Créé le 17 mars 2015  ·  22Commentaires  ·  Source: readthedocs/readthedocs.org

Récemment, nous avons commencé à voir cette erreur apparaître :

matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

  warnings.warn(_use_error_msg)
/var/build/user_builds/astropy/checkouts/latest/docs/analytic_functions/index.rst:83: WARNING: Exception occurred in plotting index-1
 from /var/build/user_builds/astropy/checkouts/latest/docs/analytic_functions/index.rst:
Traceback (most recent call last):
  File "/usr/lib/pymodules/python2.7/matplotlib/sphinxext/plot_directive.py", line 515, in run_code
    exec code in ns
  File "<string>", line 14, in <module>
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 1046, in subplots
    fig = figure(**fig_kw)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 423, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 79, in new_figure_manager
    return new_figure_manager_given_figure(num, figure)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 87, in new_figure_manager_given_figure
    window = Tk.Tk()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1767, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
TclError: no display name and no $DISPLAY environment variable

lors de l'utilisation de matplotlib plot_directive. Il semble que quelque chose ait changé dans la configuration RTD et que le backend soit par défaut quelque chose d'interactif.

(voici le problème Astropy où quelqu'un a signalé ceci pour la première fois : https://github.com/astropy/astropy/issues/3600)

Operations

Commentaire le plus utile

Salut,
cela n'a pas fonctionné pour moi
importer matplotlib
matplotlib.use('Agg')

donc à la place j'ai utilisé :
importer matplotlib.pyplot en tant que plt
plt.switch_backend('agg')

ça a marché. c'est peut-être utile à quelqu'un d'autre.

Tous les 22 commentaires

@ericholscher - une idée de ce qui pourrait être à l'origine de cela ? Toutes nos parcelles sont actuellement rompues à cause de ce problème, qui semble hors de notre contrôle et lié à la RTD. Est-ce que d'autres projets n'ont pas ce problème ?

Nous n'avons rien changé à ma connaissance. Avez-vous essayé cette solution de contournement ?
http://stackoverflow.com/a/3054314

Le mar 24 mars 2015 à 01h48, Thomas Robitaille < [email protected]

a écrit:

@ericholscher https://github.com/ericholscher - une idée de ce qui pourrait être
causant ça ? Toutes nos parcelles sont actuellement cassées à cause de ce problème, qui
semble hors de notre contrôle et lié à la RTD. Est-ce que d'autres projets n'ont pas
ce problème?

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/rtfd/readthedocs.org/issues/1195#issuecomment -85406365
.

Eric Holscher
Créateur d'Internet résidant à Portland, ou
http://ericholscher.com

@ericholscher - oui, nous l'appelons déjà mais nous voyons :

/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning:  This call to matplotlib.use() has no effect
because the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

ce qui suggère que le backend a déjà été défini à l'avance.

Aucune suggestion? Je ne connais pas grand-chose à matplotlib, et nous n'avons pas fait
tout ce que je sais devrait l'effectuer. Je suis heureux de le mettre à niveau, il semble
nous utilisons 1.3.1, mais je ne sais pas vraiment comment déboguer les problèmes puisque je
ne connais pas du tout le logiciel.

Le mar 24 mars 2015 à 9h01, Thomas Robitaille < [email protected]

a écrit:

@ericholscher https://github.com/ericholscher - oui, nous appelons déjà
ceci mais on voit :

/usr/lib/pymodules/python2.7/matplotlib/ init .py:1173 : UserWarning : cet appel à matplotlib.use() n'a aucun effet
parce que le backend a déjà été choisi ;
matplotlib.use() doit être appelé _avant_ pylab, matplotlib.pyplot,
ou matplotlib.backends est importé pour la première fois.

ce qui suggère que le backend a déjà été défini à l'avance.

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/rtfd/readthedocs.org/issues/1195#issuecomment -85576963
.

Eric Holscher
Créateur d'Internet résidant à Portland, ou
http://ericholscher.com

Peut-être que @mdboom a des idées - je suis également un peu perplexe quant au comportement actuel. Fondamentalement, je ne comprends pas comment cela change d'utiliser TkAgg ( puisqu'il semble que la valeur par défaut sur RTD soit Agg ).

Ah, désolé, je pense que je l'ai. Découvrez ce projet minimaliste :

https://github.com/astrofrog/test-rtd

Le journal RTD (https://readthedocs.org/builds/test-rtd-astrofrog/2482239/) affiche :

Making output directory...
Running Sphinx v1.2.2
TkAgg

donc le backend par défaut est défini sur TkAgg.

@mdboom , avez-vous des suggestions sur la façon de vous assurer que le backend par défaut est Agg, et non TkAgg, à l'échelle du système ? Il n'y a aucune raison pour que le backend TkAgg soit nécessaire sur RTD.

On dirait qu'il y a une configuration dans /etc/matplotlibrc qui le définit.

Le mar 24 mars 2015 à 9h14, Thomas Robitaille < [email protected]

a écrit:

Ah, désolé, je pense que je l'ai. Découvrez ce projet minimaliste :

https://github.com/astrofrog/test-rtd

Le journal RTD (https://readthedocs.org/builds/test-rtd-astrofrog/2482239/)
spectacles:

Création du répertoire de sortie...
Exécuter Sphinx v1.2.2
TkAgg

donc le backend par défaut est défini sur TkAgg.

@mdboom https://github.com/mdboom , avez-vous des suggestions sur la façon dont
pour s'assurer que le backend par défaut est Agg, et non TkAgg, à l'échelle du système ?

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/rtfd/readthedocs.org/issues/1195#issuecomment-85586195
.

Eric Holscher
Créateur d'Internet résidant à Portland, ou
http://ericholscher.com

@ericholscher - ah super, pouvez-vous le changer en Agg ? Il n'y a aucune raison que ce soit autre chose sur un serveur sans affichage comme RTD. Ensuite, personne n'aura besoin d'utiliser la solution matplotlib.use contournement

@ericholscher - cela semble fonctionner maintenant, avez-vous effectué le changement ? Si c'est le cas, ce problème peut être clos :)

Oui, devrait être changé. Le gardera ouvert car il doit être corrigé dans
nos scripts de déploiement également, afin qu'il ne se casse pas à nouveau lorsque nous exécutons un nouveau
serveur de construction.

Le mar 24 mars 2015 à 10:53, Thomas Robitaille <
[email protected]> a écrit :

@ericholscher https://github.com/ericholscher - cela semble fonctionner
maintenant, avez-vous fait le changement? Si c'est le cas, ce problème peut être clos :)

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/rtfd/readthedocs.org/issues/1195#issuecomment-85620289
.

Eric Holscher
Créateur d'Internet résidant à Portland, ou
http://ericholscher.com

Croyez que cela devrait être corrigé.

bonjour je rencontre le meme probleme
"parce que le backend a déjà été choisi ; matplotlib.use() doit être appelé _avant_ pylab, matplotlib.pyplot ou matplotlib.backends est importé pour la première fois."
Je me demande comment configurer /etc/matplotlibrc pour résoudre ce problème.
Merci !!!

Salut, n'importe qui pourrait commenter comment résoudre ce problème. comment configurer /etc/matplotlibrc pour résoudre ce problème.

Eh bien, mettre ces lignes au début du code Py résout le problème :
importer matplotlib
matplotlib.use('Agg')

Salut,
cela n'a pas fonctionné pour moi
importer matplotlib
matplotlib.use('Agg')

donc à la place j'ai utilisé :
importer matplotlib.pyplot en tant que plt
plt.switch_backend('agg')

ça a marché. c'est peut-être utile à quelqu'un d'autre.

Bonjour, je travaille dans spyder, dans @windows , et cela a ENFIN fonctionné pour moi :
Allez dans Outils>Préférences>Terminal IPython>Graphiques (les noms de menus sont une approximation puisque mon spyder est en espagnol)
Une fois ici, décochez la case "Activer le support".

Redémarrez Spyder puis tapez :

importer matplotlib
matplotlib.use('TkAgg')
importer matplotlib.pyplot en tant que plt

Exemple de tracé enregistré dans un fichier pdf

a = [1, 2, 3, 4]
b = [2, 4, 6, 8]
plt.plot(a, b)

plt.savefig('test.pdf')

J'espère que ceci vous aide.

Se pourrait-il que ce problème ait refait surface dans l'image Python 3.6 ? Depuis qu'il obtient un

No module named '_tkinter'

pour un module important matplotlib avec la dernière image.

@Tillsten avez-vous essayé de spécifier cette exigence dans votre fichier requirements.txt ? Si vous pensez toujours que le problème est lié à rtd, veuillez ouvrir un nouveau problème avec le lien de votre projet rtd.

Oui je l'ai fait. Le problème semble être identique à ce problème : matplotlib est installé, mais le backend par défaut est défini sur tkagg (à l'aide de tkinter), qui n'est pas disponible sur l'image rtd sans tête. Ce problème peut être résolu en modifiant le fichier rc comme ci-dessus ou en mettant à niveau matplotlib vers 3.0, ce qui devrait résoudre ce problème.

Ma solution de contournement actuelle consiste simplement à importer et à définir le backend matplotlib dans le sphinx conf.py :

 import matplotlib
 matplotlib.use('agg')

Merci d'avoir partagé la solution de contournement ! Je regarderai les images du docker plus tard

Je n'ai rien vu d'autre sur les images docker liées à cela, donc je ne sais pas comment cela a été résolu (peut-être que rtd n'utilisait pas les images docker à ce moment-là ?). Nous avons une solution de contournement, donc je ne sais pas si nous devons rouvrir. Peut-être en ajoutant ceci à la faq?

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