Ipython: QXcbConnection: Konnte keine Verbindung zum Display herstellen

Erstellt am 31. Mai 2017  ·  32Kommentare  ·  Quelle: ipython/ipython

Wenn ich eine völlig frische Conda-Umgebung schaffe:

conda create --name test ipython matplotlib

und dann versuchen, import matplotlib.pyplot aus ipython heraus zu versuchen, bekomme ich folgendes:

In [1]: import matplotlib.pyplot

In [2]: QXcbConnection: Could not connect to display
Aborted

Es gibt kein Problem, wenn ich das gleiche in der Vanille-Python-Shell ausführe. Tritt sowohl für py2.7.13 (ipython 5.3.0) als auch für py3.6.1 (ipython 6.0.0) auf.

Ich weiß nicht , ob dies ein ipython Bug oder ein Conda Fehler, so dass ich mit zunächst ein Thema angesprochen Anakonda , aber ich wollte es auch hier zu beachten.

Hilfreichster Kommentar

Es gibt eine Lösung mit Umgebungsvariablen, die hier verfügbar

Das Einstellen von export QT_QPA_PLATFORM='offscreen' in meinem .bash_profile hat bei mir funktioniert.

Alle 32 Kommentare

Können Sie überprüfen, ob os.environ['DISPLAY'] in IPython und in der Vanilla-Python-Shell gleich ist?

Ich vermute, es könnte daran liegen, dass Matplotlib ein anderes Backend auswählt, obwohl ich nicht sicher bin, warum das so ist.

Richtig - ich habe vergessen zu erwähnen, dass ich dies auf einem Cluster-Hauptknoten ausführe, der keine Anzeige hat. Es gibt also kein $DISPLAY-Set ( os.environ['DISPLAY'] gibt KeyError auf beiden Shells).

Und wenn ich das Backend explizit auf 'agg' setze, bekomme ich den Fehler auch nicht, aber ich möchte vermeiden, dass ich das jedes Mal tun muss, wenn ich ipython starte und etwas importieren möchte, das Matplotlib importiert.

Verwenden Sie die IPython-Terminalschnittstelle oder IPython als Kernel in einer Jupyter-Schnittstelle? Ich denke, IPython als Kernel legt die Umgebungsvariable MPLBACKEND , dass standardmäßig Inline-Plots erstellt werden, aber das sollte mit IPython im Terminal nicht passieren. Und ich glaube sowieso nicht, dass die Inline-Plots einen X-Server brauchen. :-/

Ich habe nur die Ipython-Terminalschnittstelle verwendet. Es scheint, dass, wenn ein DISPLAY nicht verfügbar ist, das Backend standardmäßig etwas verwenden sollte, das es nicht benötigt, aber das scheint nicht zu passieren.

@tacaswell eine Idee, warum IPython das Standard-Backend hier beeinflusst?

Dies geschieht, weil das Standard-Backend für Matplotlib in Anaconda Qt5 ist. Wir erwägen, es auf Tk umzustellen, um diese Art von Problemen zu vermeiden.

Der Wechsel zu Tk würde immer noch das gleiche Problem haben.

Ich denke, es wird sofort mit IPython vs. Python angezeigt, denn wenn Pyplot in IPython importiert wird, bemerkt es die Ereignisschleifenintegration und richtet sie ein. In der einfachen Eingabeaufforderung würden Sie schließlich ein Problem erhalten, wenn der Benutzer versuchte, einen Plot zu erstellen.

Ich denke, der Wechsel zu tk als Standard wäre weniger als großartig.

Ich denke, der Wechsel zu tk als Standard wäre weniger als großartig.

Was genau meinst du? Glaubst du, es ist besser für Anaconda, bei Qt5 zu bleiben?

Qt5 ist ein schöneres Framework und unterstützt sofort einsatzbereite Hi-dpi-Bildschirme. Ich denke, eine Rückkehr zu Tk wäre ein Rückschritt in der Benutzererfahrung.

Ok, wir machen uns nur ein bisschen Sorgen, dass das Notebook in kopflosen Docker-Containern läuft. Aber mit Matplotlib 1.5 (glaube ich) wählt das Notebook automatisch inline als Standard-Backend aus, oder?

Das ist ganz auf der Jupyter-Seite.

Wenn die Umgebungsvariable MPLBACKEND nicht gesetzt ist, legt ipykernel sie so fest, dass sie auf das Inline-Backend verweist. Die Kommentare in unserem Quellcode sagen, dass dies mpl >= 1.5 betrifft und dass es Vorrang vor matplotlibrc hat, aber nicht vor der expliziten Auswahl eines Backends im Code.

Das ist echt cool! Dann würde ich sagen, das kann geschlossen werden.

Das OP kann einfach 'agg' als Standard-Backend von Matplotlib in seiner Matplotlibrc festlegen, um diesen Fehler zu vermeiden.

Beim erneuten Lesen stelle ich fest, dass es ursprünglich um Terminal-IPython ging, nicht um den Kernel. Was ich oben über das Setzen von MPLBACKEND gesagt habe, gilt nicht für das Terminal IPython.

Ich schließe dies jetzt, weil ich nicht denke, dass es sich bei dem, was gemeldet wird, um einen Fehler in IPython handelt. Vielleicht ist es Sache des Benutzers, ein Headless-Backend zu konfigurieren, oder vielleicht sollte die "inside IPython"-Prüfung von MPL auch überprüfen, ob es sich in einer Headless-Umgebung befindet. Wie auch immer, ich glaube nicht, dass IPython etwas tun kann, um es zu beheben.

Sie können dieses Thema jedoch weiterhin als Diskussionsgrundlage nutzen.

Ja, es scheint klar zu sein, dass es sich nicht um einen Ipython-Bug handelt. Ich würde denken, dass MPL die Überprüfungen durchführen sollte, um es jemandem zu ermöglichen, eine Ipython-Shell zu starten und matplotlib.pyplot zu importieren, und dass dies nicht abstürzt, ohne dass matplotlibrc-Optionen geändert oder das Backend explizit festgelegt werden muss.

@timothydmorton Das Problem besteht darin, den Unterschied zwischen "Der Benutzer hat gerade darum gebeten, ein GUI-Backend zu verwenden, aber sie haben es nur so gemeint und wir sollten auf Agg zurückgreifen" vs "Der Benutzer hat gerade darum gebeten, ein GUI-Backend zu verwenden, wir können nicht weil kein X-Server läuft, also sollten wir sie wissen lassen" aus einer String-Eingabe. Der Kompromiss war in der Vergangenheit zugunsten der interaktiven Benutzer und verhinderte den Fehler "kein Plot angezeigt" und ließ den Fehler "Ich kann kein interaktives Backend auf einem kopflosen Server verwenden" auftreten, da der Benutzer im letzteren Fall eine klare Nachricht erhält Fehler, was falsch ist.

Vor kurzem gab es einige Diskussionen darüber, wie man "welche Qt-Variante auch immer installiert ist" als Backend unterstützt und wie man Backend-Fallbacks durchführt, aber im Allgemeinen wird es schwierig, da GUI-Frameworks dazu neigen, sich gegenseitig auf die Zehen zu treten, wenn Sie sie gleichzeitig importieren.

Ich bin auch von diesem Problem betroffen, und ich kann mir keine gute Lösung vorstellen, außer normales Python anstelle von Ipython zu verwenden.

@russelljjarvis es ist ein kleines Ärgernis, aber wenn der erste Befehl, den Sie beim Starten von ipython ausführen, import matplotlib; matplotlib.use('agg') ist, sollte ipython für Sie funktionieren.

Jawohl:

import matplotlib; matplotlib.use('agg')

Ist der erste Befehl, den ich ausführe, aber ich erhalte immer noch:

In [1]: QXcbConnection: Could not connect to display :0
Aborted

Nachdem das Programm auf einen Fehler gestoßen ist, würde ich normalerweise eine Aufforderung zum Debuggen und Affenpatch erhalten.

Ich rufe Python nach dem ersten Ausführen mit ipython -i file_name.py auf: ipcluster start -n 8 --profile=default &

Wobei die erste Zeile von file_name import matplotlib; matplotlib.use('agg')

Ich frage mich, ob das Ausführen von ipcluster die Probleme verursachen könnte.

Es gibt eine Lösung mit Umgebungsvariablen, die hier verfügbar

Das Einstellen von export QT_QPA_PLATFORM='offscreen' in meinem .bash_profile hat bei mir funktioniert.

Ein Kollege hat kürzlich dasselbe vorgeschlagen. Im Kontext von Docker wäre Ihre Aussage:
ENV QT_QPA_PLATFORM offscreen . Das teste ich jetzt effektiv.

Ich bekomme den gleichen Fehler:

Die Einstellung von export QT_QPA_PLATFORM='offscreen' änderte die Fehlermeldung in:

(python:17399): Gtk-WARNING **: cannot open display:

Lösung direkt im Notebook

import os
os.environ['QT_QPA_PLATFORM']='offscreen'

Als späte Fortsetzung unterstützen wir ab Matplotlib 3.0 jetzt die automatische Backend-Auswahl und werden nicht versuchen, ein GUI-Backend auf einem Headless-Server zu verwenden (aber respektieren immer noch eine rcparams-Datei, die uns dazu auffordert).

"conda update matplotlib" hat das Problem für mich behoben.

Folgende Einstellung funktioniert!!!

export QT_QPA_PLATFORM='offscreen'

Als späte Fortsetzung unterstützen wir ab Matplotlib 3.0 jetzt die automatische Backend-Auswahl und werden nicht versuchen, ein GUI-Backend auf einem Headless-Server zu verwenden (aber respektieren immer noch eine rcparams-Datei, die uns dazu auffordert).

Matplotlib 3.1 kann kein automatisches Backend unterstützen, wir müssen 'Agg' manuell setzen.

Dies geschieht, weil das Standard-Backend für Matplotlib in Anaconda Qt5 ist. Wir erwägen, es auf Tk umzustellen, um diese Art von Problemen zu vermeiden.

wo kann ich das ändern?

Dies ist mein Fehler nach der Einstellung von export QT_QPA_PLATFORM=offscreen

[tb571<strong i="7">@da02</strong> ~]$ jupyter console --kernel slicer-4.11
qt.qpa.plugin: Could not find the Qt platform plugin "offscreen" in ""
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Nach dem Setzen von QT_QPA_PLATFORM='offscreen' laufen die Importe von Matplotlib- und Fastai-Bibliotheken.
plt.figure() oder jeder andere Befehl, der einen Plot ausgibt, löst jedoch die folgenden Fehler aus:

This plugin does not support propagateSizeHints()
This plugin does not support raise()

Ich bekomme auch diesen Fehler

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen