Ich habe mich vor ein paar Wochen in ein edx Kurse für Data Scientist eingeschrieben und diesen erfolgreich mit einem Zertifikat bestanden. Die zu verwendete Shell hat damals DataCamp bereitgestellt. IPython kam hierbei zum Einsatz. In dem Kurs habe ich erstes Grundwissen über numpy, matplotlib und Pandas erworben. Dieses Wissen wollte ich nun an meinem vServer anwenden. Dafür habe ich zuerst matplotlib für Python3 installiert.
apt install python3-matplotlib
Zum Testen habe ich das Script von unten(Testbeispiel) benutzt. Führt man das Script direkt aus, sollte folgende Fehlermeldung kommen.
/usr/lib/python3/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment. warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.') /usr/lib/python3/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment. warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.') Traceback (most recent call last): File "test.py", line 6, in <module> plt.plot(x, x, label='linear') File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 3147, in plot ax = gca() File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 928, in gca return gcf().gca(**kwargs) File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 578, in gcf return figure() File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 527, in figure **kwargs) File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 84, in new_figure_manager return new_figure_manager_given_figure(num, figure) File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 92, in new_figure_manager_given_figure window = Tk.Tk() File "/usr/lib/python3.5/tkinter/__init__.py", line 1871, in __init__ self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) _tkinter.TclError: no display name and no $DISPLAY environment variable
Der Fehler besagt, dass kein “Display” gefunden wird, in dem der Graph angezeigt werden kann.
Wir rufen das Script ja schließlich über die Shell auf. Es fehlt dementsprechend ein xServer, der den Output zu einem Client tunnelt. Dazu sind ein paar Anpassungen auf dem Server als auch am Client notwendig.
Server-Seite
Auf dem Server muss unter anderem das xauth Paket installiert werden.
apt install xauth
Neben dem Paket ist auch eine Änderung an der sshd_config notwendig, damit ssh den eigentlichen Output auch weiterleitet. Dazu fügt die 2 Parameter hinzu oder ändert sie ab.
vi /etc/ssh/sshd_config X11Forwarding yes X11DisplayOffset 10
Client-Seite
Auf der Client Seite sollte ein xServer installiert sein. Sehr beliebt ist hier Xming. Xming ist hier zu bekommen.
Die Installation ist schnell und einfach. Nach ein paar Einstellungen die zu treffen sind, ist der xServer auch schnell installiert.
Auf der Putty Shell im Client muss der X11 noch aktiviert werden. Dazu tickt den “Enable X11 forwarding” an.
TestBeispiel
Hier das Testbeispiel, welches ich benutzt habe, um den xServer zu testen. Das Scipt habe ich dabei von hier: https://matplotlib.org/3.1.1/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2, 100) plt.plot(x, x, label='linear') plt.plot(x, x**2, label='quadratic') plt.plot(x, x**3, label='cubic') plt.xlabel('x label') plt.ylabel('y label') plt.title("Simple Plot") plt.legend() plt.show()
Ist der xServer auf dem Client installiert und gestartet, sollte der Graphic Output nun lokal auf dem Rechner zu sehen sein, auf dem der Command ausgeführt wurde.