Warum löst dies das Problem 'keine $ DISPLAY-Umgebung' mit Matplotlib?

8

Beim Ausführen eines Codes, der die matplotlib -Bibliothek auf meinem Desktop-PC verwendet, habe ich keine Probleme mit der Zeile:

%Vor%

weit unten im Code, wo ich tatsächlich die Plotfunktionen verwende.

Wenn ich den Code auf einem Server ausführe, funktioniert er nur, wenn ich matplotlib vor importiere und erzwinge, das Agg Backend zu verwenden. Das heißt, ich muss am Anfang des Codes die folgenden Zeilen hinzufügen:

%Vor%

(siehe diese Antwort , wo dies erklärt wird). Andernfalls stürzt der Code mit TclError: no display name and no $DISPLAY environment variable ab (siehe diese Frage zum Beispiel).

Die Frage ist: Warum muss ich das tun? Die Lösung funktioniert einwandfrei, aber ich weiß nicht, warum ich das nicht auf meinem Desktop-PC machen muss, aber ich muss unbedingt, wenn der Code auf dem Server läuft.

    
Gabriel 23.03.2015, 18:19
quelle

1 Antwort

9

X11 folgt einem Client / Server-Modell, bei dem der X-Server Anfragen zur grafischen Ausgabe von Client-Anwendungen akzeptiert (z. B. interaktive Matplotlib-Sitzungen) und Benutzereingaben von Tastatur, Maus usw. zurücksendet. Damit dieses Modell funktioniert, Client-Anwendungen müssen wissen, an welchen X-Server sie ihre Anforderungen senden sollen. Dies wird durch die Umgebungsvariable $DISPLAY gesteuert. Wenn Sie eine Verbindung zu einer Remote-X-Sitzung herstellen (z. B. über eine SSH-Verbindung), muss die Variable $DISPLAY in Ihrer Remotesitzung auf Ihren lokalen X-Server verweisen.

Die Variable $DISPLAY ist folgendermaßen aufgebaut:

%Vor%

Nicht alle Teile können vorhanden sein - der Hostname wird normalerweise für lokale Sitzungen weggelassen, und die Bildschirmnummer wird auch weggelassen, wenn nur ein Bildschirm vorhanden ist. In einer lokalen Terminalsitzung auf dem Laptop sieht mein $DISPLAY wie folgt aus:

%Vor%

Sofern der Remote-Server auch X11 unterstützt, ist es möglich, grafische Fenster auf dem Remote-Rechner zu öffnen und sie auf Ihrem lokalen Rechner anzuzeigen, indem Sie X11-Weiterleitung . Für eine SSH-Verbindung tun Sie dies, indem Sie das Flag -X (oder -Y ) übergeben.

Zum Beispiel:

%Vor%

Der Remote-SSH-Server sollte darauf achten, die Variable $DISPLAY beim Öffnen der Verbindung entsprechend einzustellen. In diesem speziellen Fall ist localhost:10.0 tatsächlich ein "Proxy" X11-Server, der auf dem entfernten Rechner läuft, der auf dem Display 10 lauscht und Befehle an Ihren lokalen X-Server über die SSH-Verbindung weiterleitet ( werfen Sie einen Blick auf diese , wenn Sie an den Details interessiert sind.

Nun sollten Sie in der Lage sein, eine Remote-IPython-Sitzung zu starten, Matplotlib mit einem interaktiven Backend zu importieren und Plot-Fenster zu erstellen, die dann auf Ihrem lokalen Rechner erscheinen. Da Ihre Tastatur- / Mauseingabe und die Bildschirmausgabe nun über eine verschlüsselte Netzwerkverbindung laufen, sind die Plotfenster weniger reaktionsschnell als Sie es für eine lokale Sitzung gewohnt sind.

Noch ein Wort der Warnung: Wenn Sie eine IPython-Sitzung mit einer interaktiven Matplotlib-Sitzung geöffnet haben, ist es unmöglich, die SSH-Verbindung zu schließen, ohne den IPython-Prozess zu beenden. Manchmal rufe ich auch matplotlib.use("Agg") auf, bevor ich einen lang andauernden Prozess starte, der Matplotlib importiert - auf diese Weise kann ich die Verbindung zum Remote-Server trennen, ohne den Prozess zu beenden.

    
ali_m 23.03.2015, 19:02
quelle

Tags und Links