Ipython: QXcbConnection: Tidak dapat terhubung ke tampilan

Dibuat pada 31 Mei 2017  ·  32Komentar  ·  Sumber: ipython/ipython

Ketika saya membuat lingkungan conda yang benar-benar segar:

conda create --name test ipython matplotlib

dan kemudian mencoba import matplotlib.pyplot dari dalam ipython, saya mendapatkan yang berikut:

In [1]: import matplotlib.pyplot

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

Tidak ada masalah ketika saya menjalankan hal yang sama di shell python vanilla. Terjadi untuk py2.7.13 (ipython 5.3.0) dan py3.6.1 (ipython 6.0.0).

Saya tidak tahu apakah ini bug ipython atau bug conda, jadi saya mengangkat masalah terlebih dahulu dengan anaconda , tetapi saya juga ingin mencatatnya di sini.

Komentar yang paling membantu

Ada solusi menggunakan variabel lingkungan yang tersedia di sini :

Pengaturan export QT_QPA_PLATFORM='offscreen' di .bash_profile saya berhasil untuk saya.

Semua 32 komentar

Bisakah Anda memeriksa apakah os.environ['DISPLAY'] sama di IPython seperti di shell Python Vanilla?

Saya kira itu mungkin matplotlib memilih backend yang berbeda, meskipun saya tidak yakin mengapa itu akan dilakukan.

Benar-- Saya lupa menyebutkan bahwa saya menjalankan ini pada node kepala cluster yang tidak memiliki tampilan. Jadi tidak ada set $DISPLAY ( os.environ['DISPLAY'] memberikan KeyError pada kedua shell).

Dan jika saya secara eksplisit mengatur backend ke 'agg' Saya juga tidak mendapatkan kesalahan, tetapi saya ingin menghindari keharusan melakukan itu setiap kali saya meluncurkan ipython dan ingin mengimpor sesuatu yang mengimpor matplotlib.

Apakah Anda menggunakan antarmuka terminal IPython atau IPython sebagai kernel di antarmuka Jupyter? Saya pikir IPython sebagai kernel menetapkan variabel lingkungan MPLBACKEND untuk menghasilkan plot sebaris secara default, tetapi itu tidak boleh terjadi dengan IPython di terminal. Dan saya rasa plot inline tidak memerlukan server X. :-/

Saya hanya menggunakan antarmuka terminal ipython. Tampaknya jika DISPLAY tidak tersedia maka backend harus default ke sesuatu yang tidak membutuhkannya, tetapi itu tampaknya tidak terjadi.

@tacaswell adakah yang tahu mengapa IPython mungkin memengaruhi backend default di sini?

Ini terjadi karena backend default untuk Matplotlib di Anaconda adalah Qt5. Kami sedang mempertimbangkan untuk mengubahnya ke Tk untuk menghindari masalah seperti ini.

Mengubah ke Tk masih memiliki masalah yang sama.

Saya pikir itu segera muncul dengan IPython vs python karena jika pyplot diimpor di dalam IPython, ia akan memperhatikan dan mengatur integrasi loop acara. Di Prompt biasa, Anda akhirnya akan mendapatkan masalah ketika pengguna mencoba membuat plot.

Saya pikir pindah ke tk sebagai default akan kurang bagus.

Saya pikir pindah ke tk sebagai default akan kurang bagus.

Apa maksudmu sebenarnya? Apakah menurut Anda lebih baik bagi Anaconda untuk tetap bersama Qt5?

Qt5 adalah kerangka kerja yang lebih bagus dan mendukung layar hi-dpi di luar kotak, saya pikir kembali ke Tk akan menjadi regresi dalam pengalaman pengguna.

Oke, kami hanya sedikit khawatir tentang notebook yang berjalan di wadah Docker tanpa kepala. Tetapi dengan Matplotlib 1.5 (saya pikir), notebook secara otomatis memilih inline sebagai backend default, bukan?

Itu sepenuhnya di sisi jupyter.

Jika variabel lingkungan MPLBACKEND belum disetel, ipykernel menyetelnya untuk merujuk ke backend sebaris. Komentar dalam kode sumber kami mengatakan bahwa ini akan memengaruhi mpl >= 1.5, dan ini lebih diprioritaskan daripada matplotlibrc tetapi tidak secara eksplisit memilih backend dalam kode.

Itu keren sekali! Lalu saya akan mengatakan ini bisa ditutup.

OP dapat dengan mudah mengatur 'agg' sebagai backend default Matplotlib di matplotlibrc-nya untuk menghindari kesalahan ini.

Membaca ulang ini, saya perhatikan bahwa ini awalnya tentang terminal IPython, bukan kernel. Apa yang saya katakan di atas tentang pengaturan MPLBACKEND tidak berlaku untuk terminal IPython.

Saya akan menutup ini sekarang karena menurut saya apa yang dilaporkan adalah bug di IPython. Mungkin terserah pengguna untuk mengonfigurasi backend tanpa kepala, atau mungkin pemeriksaan "di dalam IPython" MPL juga harus memeriksa apakah itu di lingkungan tanpa kepala. Either way, saya tidak berpikir ada yang bisa dilakukan IPython untuk memperbaikinya.

Jangan ragu untuk tetap menggunakan masalah ini sebagai tempat untuk mendiskusikannya.

Ya, tampaknya jelas bahwa ini bukan bug ipython. Saya akan berpikir bahwa MPL harus melakukan pemeriksaan untuk memungkinkan seseorang meluncurkan shell ipython dan mengimpor matplotlib.pyplot, dan tidak crash, tanpa harus mengubah opsi matplotlibrc atau secara eksplisit mengatur backend.

@timothydmorton Masalahnya adalah memberi tahu perbedaan antara "Pengguna hanya meminta untuk menggunakan backend GUI, tetapi mereka hanya bermaksud begitu dan kami harus kembali ke Agg" vs "Pengguna hanya meminta untuk menggunakan backend GUI, kami tidak bisa karena tidak ada X-sever yang berjalan jadi kami harus memberi tahu mereka" dari input string. Pertukaran secara historis mendukung pengguna interaktif dan mencegah bug "tidak ada plot yang muncul" dan membiarkan bug "Saya tidak dapat menggunakan backend interaktif pada server tanpa kepala" terjadi karena dalam kasus selanjutnya pengguna mendapatkan kejelasan kesalahan tentang apa yang salah.

Ada beberapa diskusi baru-baru ini tentang bagaimana mendukung "rasa Qt mana yang diinstal" sebagai backend dan bagaimana melakukan backend fallback, tetapi secara umum menjadi rumit karena kerangka kerja GUI cenderung saling menginjak jika Anda mengimpornya secara bersamaan.

Saya juga terpengaruh oleh masalah ini, dan saya tidak bisa memikirkan solusi yang baik selain menggunakan python biasa alih-alih ipython.

@russelljjarvis itu gangguan kecil, tetapi jika perintah pertama yang Anda jalankan ketika Anda memulai ipython adalah import matplotlib; matplotlib.use('agg') maka ipython akan bekerja untuk Anda.

Ya:

import matplotlib; matplotlib.use('agg')

Apakah perintah pertama yang saya jalankan, tetapi saya masih mendapatkan:

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

Setelah program mengalami kesalahan, dan biasanya saya akan dibiarkan dengan prompt untuk men-debug dan patch monyet.

Saya memanggil python dengan ipython -i file_name.py setelah pertama kali dijalankan: ipcluster start -n 8 --profile=default &

Di mana baris pertama file_name adalah import matplotlib; matplotlib.use('agg')

Saya ingin tahu apakah menjalankan ipcluster mungkin menyebabkan masalah.

Ada solusi menggunakan variabel lingkungan yang tersedia di sini :

Pengaturan export QT_QPA_PLATFORM='offscreen' di .bash_profile saya berhasil untuk saya.

Seorang rekan baru-baru ini menyarankan hal yang sama. Dalam konteks Docker, pernyataan Anda adalah:
ENV QT_QPA_PLATFORM offscreen . Saya secara efektif menguji itu sekarang.

Saya mendapatkan kesalahan yang sama:

Pengaturan export QT_QPA_PLATFORM='offscreen' mengubah pesan kesalahan menjadi:

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

solusi di notebook secara langsung

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

Sebagai tindak lanjut yang terlambat, pada Matplotlib 3.0 kami sekarang mendukung pemilihan backend otomatis dan tidak akan mencoba menggunakan backend GUI pada server tanpa kepala (tetapi akan tetap menghormati file rcparams yang meminta kami melakukannya).

"conda update matplotlib" memperbaiki masalah untuk saya.

Pengaturan berikut berfungsi!!!

ekspor QT_QPA_PLATFORM='di luar layar'

Sebagai tindak lanjut yang terlambat, pada Matplotlib 3.0 kami sekarang mendukung pemilihan backend otomatis dan tidak akan mencoba menggunakan backend GUI pada server tanpa kepala (tetapi masih akan menghormati file rcparams yang meminta kami untuk melakukannya)

Matplotlib 3.1 tidak dapat mendukung backend otomatis, kita perlu mengatur 'Agg' secara manual.

Ini terjadi karena backend default untuk Matplotlib di Anaconda adalah Qt5. Kami sedang mempertimbangkan untuk mengubahnya ke Tk untuk menghindari masalah seperti ini.

di mana saya bisa mengubah yang ini?

Ini adalah kesalahan saya setelah mengatur 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.

Setelah menyetel QT_QPA_PLATFORM='offscreen' , impor pustaka matplotlib dan fastai berjalan.
Namun, plt.figure() atau perintah lain yang mengeluarkan plot menimbulkan kesalahan berikut:

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

Saya mendapatkan kesalahan ini juga

Apakah halaman ini membantu?
0 / 5 - 0 peringkat