it-swarm.com.de

Matplotlib: Anzeigeplot auf einem entfernten Rechner

Ich habe einen Python-Code, der einige Berechnungen auf einer Remote-Maschine namens A durchführt. Ich verbinde mich mit A über ssh von einer Maschine mit dem Namen B . Gibt es eine Möglichkeit, die Zahl auf Maschine B anzuzeigen?

46
Mermoz

Wenn Sie Matplotlib unter Mac OS X auf dem Remote-Computer (B) verwenden, müssen Sie zuerst sicherstellen, dass Sie eines der X11-basierten Display-Backends verwenden, da das native Mac OS X-Backend seine Plots nicht in ein anderes exportieren kann Anzeige. Die Auswahl eines Backends kann mit durchgeführt werden

import matplotlib
matplotlib.use('GTK')  # Or any other X11 back-end

Die Liste der unterstützten Backends kann abgerufen werden, indem use() ein falscher Backend-Name angegeben wird: matplotlib gibt dann eine Fehlermeldung aus, in der die möglichen Backends aufgelistet sind.

ssh X11 forwarding kann dann zur Anzeige von Matplotlib-Plots verwendet werden.

22
Eric O Lebigot

Sicher, Sie können die X11-Weiterleitung aktivieren. Normalerweise geschieht dies, indem Sie die Option -X oder -Y an ssh übergeben, wenn Sie eine Verbindung zum Remote-Computer herstellen

ssh -X computerA

Beachten Sie, dass der SSH-Dämon auf Computer A ebenfalls konfiguriert werden muss, um die X11-Weiterleitung zu aktivieren. Dies geschieht durch Putten

X11Forwarding yes

in der sshd_config-Konfigurationsdatei von Computer A.

Wenn für den SSH-Daemon von Computer A die X11-Weiterleitung nicht aktiviert ist, können Sie das Ergebnis der Berechnung jederzeit in eine Textdatei schreiben, auf Computer B herunterladen und Matplotlib lokal verwenden.

24
David Z

Folgendes funktionierte für mich mit Mac OS X auf der lokalen Maschine (Maschine B) und Ubuntu auf der Fernbedienung (Maschine A).

Sie benötigen einen X11-Server, der auf Ihrem lokalen Computer installiert ist.

Wenn Sie eine neuere Version von Mac OSX (OS X Mountain Lion oder neuer) ausführen, wäre X11 NICHT vorinstalliert (siehe http://support.Apple.com/kb/ht5293 ). . Prüfen Sie, ob Sie X11 haben, indem Sie das Mac-Terminal öffnen, und führen Sie den Befehl xterm..__ aus. Wenn sich ein X11-Fenster öffnet, sind Sie fertig. Wenn der Befehl nicht gefunden wurde, gehen Sie zu http://xquartz.macosforge.org/landing/ und installieren Sie den X11-Server. Melden Sie sich dann ab und wieder bei Ihrem Mac an.

Versuchen Sie nach erneuter Anmeldung erneut, den Befehl xterm auszuführen. Es sollte sich das X11-Fenster öffnen . An dieser Stelle sollte auch Ihre $ DISPLAY-Variable korrekt gesetzt sein. Ist dies nicht der Fall, stellen Sie sicher, dass Sie sich seit der Installation von X11 von XQuartz ab-/angemeldet haben.

echo $DISPLAY
/tmp/launch-I9I3aI/org.macosforge.xquartz:0

Verwenden Sie dann von Ihrem lokalen Computer aus ssh -X, um den Remote-Computer A fernzusteuern:

ssh -X [email protected]

Dann auf dem entfernten Rechner:

python
>>> import matplotlib
>>> matplotlib.use('GTKAgg')  #I had to use GTKAgg for this to work, GTK threw errors
>>> import matplotlib.pyplot as plt  #...  and now do whatever you need...

Rufen Sie unbedingt matplotlib.use auf, BEVOR Sie etwas anderes aus matplotlib importieren (z. B. matplotlib.pyplot).

Weitere nützliche Tipps zur Fehlerbehebung bei der Verwendung von ssh -X: http://oroborosx.sourceforge.net/remotex.html#usessh

12
ValAyal

GTK scheint mit Python3 nicht an Ubuntu zu arbeiten. Stattdessen habe ich tkagg (von this answer) verwendet:

import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt

teste mit diesem:

import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.show()
7
wordsforthewise

wenn das nicht funktioniert, können Sie auch Folgendes versuchen:

import matplotlib.pyplot as plt
plt.switch_backend('agg')

oder

import matplotlib.pyplot as plt
plt.switch_backend('TkAgg')

das schien für mich zu funktionieren

Wenn Sie jedoch versuchen, eine GUI zum Laufen zu bringen, schlagen Sie bitte folgenden Link vor: http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/

1
Samaksh Goyal

Ich habe IPython verwendet, um das verwandte Problem zu lösen. Die Schritte sind wie folgt:

Schritt 1: Installieren Sie IPython und Jupyter lokal auf dem Remote-Computer (A) (vorausgesetzt, es gibt kein Root-Privileg). Verwenden Sie dazu die folgenden Befehle:

pip install --user ipython
pip install --user jupyter 

Update matplotlib: 

pip install --user -U matplotlib

Schritt 2: 

Führen Sie Jupyter ohne Browser aus dem Codeverzeichnis auf dem Remote-Computer aus (A):

cd PATH/TO/THE/CODE
jupyter notebook --no-browser --port=8080

Nach diesem Befehl wird eine URL wie folgt angezeigt:

http: // localhost: 8080 /? token = 5528ab1eeb3f621b90b63420f8bbfc510edf71f21437c4e2

Schritt 3:

Öffnen Sie nun ein anderes Terminal auf dem lokalen Rechner (B) und stellen Sie über ssh eine Verbindung zum entfernten Rechner (A) her:

ssh -N -L 8080:localhost:8080 [email protected]

Die Portnummer muss in step 2 und step 3 identisch sein. In diesem Beispiel lautet die Portnummer 8080.

Schritt 4:

Kopieren Sie die URL in step 3 und fügen Sie sie in einen Browser in Ihrem lokalen Computer ein (B).

Jetzt kann das Notebook auf dem Remote-Computer über den Browser verwendet werden, und die Plots können mit den Daten des Remote-Computers erstellt werden.

0
Farhana Liza

export MPLBACKEND="agg" das hat bei mir funktioniert. Natürlich können Sie es auch per Code einstellen.

0
amazia