_tkinter.TclError: kein Anzeigename und keine Umgebungsvariable $ DISPLAY

193

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.pyauf diesem Server zu verwenden, auf dem matplotlib 1.5.1 installiert ist. Er schlägt mit dem Fehler fehl:

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?

user3654307
quelle
9
Läufst du das über ssh?
Padraic Cunningham
8
... ohne -X?
Klaus D.
1
Wenn Sie es auf Jupyter Notebook ausführen, führen Sie diesen Befehl auf Notebook%matplotlib inline
GoingMyWay
Wenn Sie über Putty eine Verbindung vom Win-Computer zum Remote-Server herstellen, müssen Sie Xming installieren, um X11 weiterzuleiten.
Serenity

Antworten:

291

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 ( bevor Sie pyplot importieren ) und versuchen Sie es erneut:

import matplotlib
matplotlib.use('Agg')

Oder zur .config/matplotlib/matplotlibrcZeile hinzufügen, backend: Aggum nicht interaktives Backend zu verwenden.

echo "backend: Agg" > ~/.config/matplotlib/matplotlibrc

Oder wenn Sie eine Verbindung zum Server herstellen, verwenden Sie den ssh -X remoteMachineBefehl, 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

Gelassenheit
quelle
13
'ssh -X remoteMachine' hat mein Problem gelöst. Danke dir!
user3654307
6
Was ist eigentlich 'Agg'?
CKM
5
AGG ist die Abkürzung für Anti-Grain Geometry Engine.
Gelassenheit
5
matplotlib.use('Agg')funktioniert für mich - läuft in einem Docker-Image.
Mattia Paterna
Dieser hat mein Problem gelöst. Ich verwende Google Cloud-VMs und hoffe, dass dies dazu beiträgt, dass Benutzer das gleiche Problem haben.
Demo
76

Sie können es lösen, indem Sie diese beiden Zeilen am SEHREN Anfang Ihres .py-Skripts hinzufügen .

import matplotlib
matplotlib.use('Agg')

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

Qihui
quelle
17
Es sollte ganz am Anfang des Codes stehen. Das ist wichtig.
Jäger
Dies funktionierte, wenn es matplotlibauf Docker ausgeführt wurde (kein Display angebracht), aber was macht es eigentlich?
Loretoparisi
Dies funktioniert für mich, wenn ich gerade die Python-Konsole auf meiner VM ausführe, aber genau derselbe Code mit genau dem gleichen Fehler auf der gleichen VM fehlschlägt, wenn Teil der laufenden Anwendung.
Rschwieb
Das Ändern des Backends von TkAgg zu Agg in der Konfigurationsdatei hat jedoch den Trick getan.
Rschwieb
41

Um die Antwort zusammenzufassen, habe ich diese am Anfang des benötigten Skripts verwendet. So läuft es reibungslos in 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 'Agg'Backend benutzt, nur wenn es zum Beispiel über Travis CI geht.

Sylhare
quelle
4
Diese Lösung hat den Mehrwert, bei jeder persönlichen Konfiguration die am wenigsten aufdringliche zu sein. Es sollte höher sein.
Jaumebonet
11

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 ausführen können. Ich habe auch kein Matplotlib verwendet, daher war dies nicht die Ursache für mein Problem. Ich konnte das Problem beheben, indem ich die Umgebungsvariable DISPLAY so einstellte, wie es der Fehler mit dem folgenden Befehl vorschlägt:

export DISPLAY=:0.0

Eine gute Erklärung, was die Anzeigeumgebungsvariable tut und warum die Syntax so seltsam ist, finden Sie hier: /ubuntu/432255/what-is-display-environment-variable

Ajgriese
quelle
18
Ich versuche , Plots mit Python und matplotlib.pyplot zu speichern ssh läuft über ... dies zu tun bekommt mir: _tkinter.TclError: konnte nicht Display anschließen „: 0,0“
mrk
2

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

Joseph
quelle
1

Ich habe dieses Problem auch bei der Verwendung von Xshell zum Verbinden des Linux-Servers festgestellt.

Nachdem ich nach Methoden gesucht habe, finde ich Xming + Xshell, um das Problem der Bildimshow 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.0

Modus
quelle
1

Um Bilder, Diagramme und alles zu sehen, was in Windows auf Ihrem Remote-Computer angezeigt wird, müssen Sie folgende Verbindung herstellen:

ssh -X user@hostname

Auf diese Weise aktivieren Sie den Zugriff auf den X-Server. Der X-Server ist ein Programm im X Window System, das auf lokalen Computern (dh den Computern, die direkt von Benutzern verwendet werden) ausgeführt wird und den gesamten Zugriff auf die Grafikkarten, Anzeigebildschirme und Eingabegeräte (normalerweise Tastatur und Maus) auf diesen Computern übernimmt .

Mehr Infos hier .

tsveti_iko
quelle