it-swarm.com.de

_tkinter.TclError: kein Anzeigename und keine Umgebungsvariable $ DISPLAY

Ich führe ein einfaches python Skript auf dem Server aus:

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)

Ich versuche, den Befehl python example.py auf diesem Server zu verwenden, auf dem matplotlib 1.5.1 installiert ist. Es tritt ein Fehler auf:

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

Was passiert hier?

156
user3654307

Matplotlib wählt standardmäßig das Xwindows-Backend. Sie müssen matplotlib so einstellen, dass das Xwindows-Backend nicht verwendet wird.

Fügen Sie diesen Code am Anfang Ihres Skripts hinzu (vor dem Importieren von Pyplot) und versuchen Sie es erneut:

_import matplotlib
matplotlib.use('Agg')
_

Oder fügen Sie zu _.config/matplotlib/matplotlibrc_ Zeile backend: Agg hinzu, um das nicht interaktive Backend zu verwenden.

_echo "backend: Agg" > ~/.config/matplotlib/matplotlibrc
_

Oder verwenden Sie beim Herstellen einer Verbindung zum Server den Befehl _ssh -X remoteMachine_, um Xwindows zu verwenden.

Sie können auch versuchen, die Anzeige zu exportieren: _export DISPLAY=mymachine.com:0.0_.

Für weitere Informationen: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server

242
Serenity

Sie können das Problem lösen, indem Sie diese beiden Zeilen am VERY Anfang Ihres .py-Skripts einfügen.

import matplotlib
matplotlib.use('Agg')

PS: Der Fehler bleibt bestehen, wenn diese beiden Zeilen nicht ganz am Anfang des Quellcodes eingefügt werden.

63
Qihui

Um die Antwort zusammenzufassen, habe ich diese am Anfang des benötigten Skripts verwendet. So läuft es problemlos auf verschiedenen Umgebungen.

import os
import matplotlib as mpl
if os.environ.get('DISPLAY','') == '':
    print('no display found. Using non-interactive Agg backend')
    mpl.use('Agg')
import matplotlib.pyplot as plt

Weil ich nicht wollte, dass es immer das Backend 'Agg' verwendet, nur wenn es zum Beispiel Travis CI durchläuft.

30
Sylhare

Ich hatte das gleiche Problem beim Versuch, eine einfache tkinter-App remote auf einem Raspberry Pi auszuführen. In meinem Fall wollte ich die tkinter-GUI auf dem pi-Display anzeigen, aber ich möchte sie über SSH von meinem Host-Computer aus ausführen können. Ich habe auch nicht matplotlib verwendet, das war also nicht die Ursache für mein Problem. Ich konnte das Problem beheben, indem ich die Umgebungsvariable DISPLAY festlegte, wie der Fehler mit dem Befehl andeutet:

export DISPLAY=:0.0

Eine gute Erklärung, was die Umgebungsvariable display bewirkt und warum die Syntax so ungewöhnlich ist, finden Sie hier: https://askubuntu.com/questions/432255/what-is-display-environment-variable =

6
ajgriese

Eine andere Lösung besteht darin, Xvfb zu installieren und Ihre Anzeige dorthin zu exportieren. dh:

disp=:8
screen=0
geom=640x480x24
exec Xvfb $disp -screen $screen $geom 2>/tmp/Xvfb.log &

Dann

$ export DISPLAY =: 8

$ ./example.py

1
Joseph

Dieses Problem trat auch auf, als ich mit Xshell eine Verbindung zum Linux-Server herstellte.

Nachdem ich nach Methoden gesucht habe, finde ich Xming + Xshell, um das Image-Imshow-Problem mit matplotlib zu lösen.

Wenn die oben genannten Lösungen Ihr Problem nicht lösen können, versuchen Sie einfach, Xming unter der Bedingung herunterzuladen, dass Sie Xshell verwenden. Setzen Sie dann das Attribut in Xshell, SSH-> tunnel-> X11transfer-> wählen Sie X DISPLAY localhost: 0.

1
Mode