J'exécute un simple script python sur le serveur:
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randn(60)
y = np.random.randn(60)
plt.scatter(x, y, s=20)
out_png = 'path/to/store/out_file.png'
plt.savefig(out_png, dpi=150)
J'essaie d'utiliser la commande python example.py
dans ce serveur sur lequel matplotlib 1.5.1 est installé, elle échoue avec l'erreur:
Traceback (most recent call last):
File "example.py", line 7, in <module>
plt.scatter(x, y, s=20)
File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 3241, in scatter
ax = gca()
File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 928, in gca
return gcf().gca(**kwargs)
File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 578, in gcf
return figure()
File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 527, in figure
**kwargs)
File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.py", line 84, in new_figure_manager
return new_figure_manager_given_figure(num, figure)
File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.py", line 92, in new_figure_manager_given_figure
window = Tk.Tk()
File "/usr/local/lib/python2.7/lib-tk/Tkinter.py", line 1810, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
Que se passe-t-il ici?
python
matplotlib
tkinter
user3654307
la source
la source
-X
?%matplotlib inline
Réponses:
Matplotlib choisit le backend Xwindows par défaut. Vous devez configurer matplotlib pour ne pas utiliser le backend Xwindows.
Ajoutez ce code au début de votre script ( avant d'importer pyplot ) et réessayez:
Ou ajoutez à la
.config/matplotlib/matplotlibrc
lignebackend: Agg
pour utiliser un backend non interactif.Ou lorsque vous vous connectez au serveur, utilisez la
ssh -X remoteMachine
commande pour utiliser Xwindows.Aussi , vous pouvez essayer d'affichage à l'exportation:
export DISPLAY=mymachine.com:0.0
.Pour plus d'informations: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server
la source
matplotlib.use('Agg')
fonctionne pour moi - s'exécutant dans une image Docker.Vous pouvez le résoudre en ajoutant ces deux lignes au TRÈS début de votre script .py.
PS: L'erreur existera toujours si ces deux lignes ne sont pas ajoutées au tout début du code source.
la source
matplotlib
sur le docker (pas d'affichage attaché), mais que fait-il réellement?Pour ajouter la réponse, j'ai utilisé ceci au début du script nécessaire. Il fonctionne donc sans problème sur différents environnements.
Parce que je ne voulais pas qu'il utilise toujours le
'Agg'
backend, uniquement quand il passerait par Travis CI par exemple.la source
J'ai eu ce même problème en essayant d'exécuter une simple application tkinter à distance sur un Raspberry Pi. Dans mon cas, je voulais afficher l'interface graphique de tkinter sur l'écran pi, mais je veux pouvoir l'exécuter via SSH à partir de ma machine hôte. Je n'utilisais pas non plus matplotlib, donc ce n'était pas la cause de mon problème. J'ai pu résoudre le problème en définissant la variable d'environnement DISPLAY comme le suggère l'erreur avec la commande:
Une bonne explication de ce que fait la variable d'environnement d'affichage et pourquoi la syntaxe est si étrange peut être trouvée ici: /ubuntu/432255/what-is-display-environment-variable
la source
Une autre solution consiste à installer Xvfb et à y exporter votre affichage. c'est à dire:
ensuite
$ export DISPLAY =: 8
$ ./example.py
la source
J'ai également rencontré ce problème en utilisant Xshell pour connecter un serveur Linux.
Après avoir recherché des méthodes, je trouve Xming + Xshell pour résoudre le problème d'image imshow avec matplotlib.
Si les solutions ci-dessus ne peuvent pas résoudre votre problème, essayez simplement de télécharger Xming sous la condition que vous utilisez Xshell. Ensuite, définissez l'attribut dans Xshell, SSH-> tunnel-> X11transfer-> choisissez X DISPLAY localhost: 0.0
la source
Pour voir les images, les tracés et tout ce qui est affiché sur les fenêtres de votre machine distante, vous devez vous y connecter comme ceci:
De cette façon, vous activez l'accès au serveur X. Le serveur X est un programme du système X Window qui s'exécute sur des machines locales (c'est-à-dire les ordinateurs utilisés directement par les utilisateurs) et gère tous les accès aux cartes graphiques, aux écrans d'affichage et aux périphériques d'entrée (généralement un clavier et une souris) sur ces ordinateurs .
Plus d'infos ici .
la source