Ipython: QXcbConnection: не удалось подключиться к дисплею

Созданный на 31 мая 2017  ·  32Комментарии  ·  Источник: ipython/ipython

Когда я создаю совершенно новую среду conda:

conda create --name test ipython matplotlib

а затем попробуйте import matplotlib.pyplot из ipython, я получаю следующее:

In [1]: import matplotlib.pyplot

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

Нет проблем, когда я запускаю то же самое в ванильной оболочке питона. Случается как для py2.7.13 (ipython 5.3.0), так и для py3.6.1 (ipython 6.0.0).

Я не знаю, является ли это ошибкой ipython или ошибкой conda, поэтому я сначала поднял проблему с anaconda , но я хотел бы отметить это и здесь.

Самый полезный комментарий

Там это решение с использованием переменных окружения доступны здесь :

Установка export QT_QPA_PLATFORM='offscreen' в моем .bash_profile сработала для меня.

Все 32 Комментарий

Можете ли вы проверить, что os.environ['DISPLAY'] в IPython совпадает с ванильной оболочкой Python?

Я предполагаю, что это может быть matplotlib, выбирающий другой бэкэнд, хотя я не уверен, почему он это сделал.

Правильно - я забыл упомянуть, что я запускаю это на головном узле кластера, у которого нет дисплея. Итак, $ DISPLAY не установлен ( os.environ['DISPLAY'] дает KeyError на обеих оболочках).

И если я явно установил бэкэнд на 'agg' я тоже не получаю сообщение об ошибке, но я бы не хотел делать это каждый раз, когда я запускаю ipython и хочу импортировать что-то, что импортирует matplotlib.

Используете ли вы терминальный интерфейс IPython или IPython в качестве ядра в интерфейсе Jupyter? Я думаю, что IPython как ядро ​​устанавливает переменную среды MPLBACKEND для создания встроенных графиков по умолчанию, но этого не должно происходить с IPython в терминале. И я вообще не думаю, что встроенным графикам нужен X-сервер. : - /

Я просто использовал интерфейс терминала ipython. Казалось бы, если DISPLAY недоступен, то бэкэнд должен по умолчанию использовать что-то, что не нужно, но, похоже, этого не происходит.

@tacaswell есть идеи, почему IPython может влиять на бэкэнд по умолчанию?

Это происходит потому, что бэкэнд по умолчанию для Matplotlib в Anaconda - Qt5. Мы планируем изменить его на Tk, чтобы избежать подобных проблем.

Переход на Tk по-прежнему будет иметь ту же проблему.

Я думаю, что это сразу проявляется с IPython vs python, потому что, если pyplot импортируется внутри IPython, он замечает и настраивает интеграцию цикла событий. В простой подсказке вы в конечном итоге столкнетесь с проблемой, когда пользователь попытается создать сюжет.

Я думаю, что переход на tk по умолчанию был бы не лучшим вариантом.

Я думаю, что переход на tk по умолчанию был бы не лучшим вариантом.

Что ты конкретно имеешь ввиду? Как вы думаете, для Anaconda лучше остаться с Qt5?

Qt5 - более приятный фреймворк и поддерживает экраны с высоким разрешением из коробки, я думаю, что возвращение к Tk будет регрессом в пользовательском опыте.

Хорошо, нас немного беспокоит, что ноутбук работает в безголовых контейнерах Docker. Но с Matplotlib 1.5 (я думаю) ноутбук автоматически выбирает inline качестве бэкэнда по умолчанию, верно?

Это полностью на стороне jupyter.

Если переменная окружения MPLBACKEND еще не установлена, ipykernel устанавливает ссылку на встроенный бэкэнд. Комментарии в нашем исходном коде говорят, что это повлияет на mpl> = 1.5, и что он имеет приоритет над matplotlibrc, но не над явным выбором бэкэнда в коде.

Это действительно круто! Тогда я бы сказал, что это можно закрыть.

OP может просто установить "agg" как бэкэнд по умолчанию для Matplotlib в своем matplotlibrc, чтобы избежать этой ошибки.

Перечитывая это, я замечаю, что изначально речь шла о терминальном IPython, а не о ядре. То, что я сказал выше о настройке MPLBACKEND, не относится к терминальному IPython.

Я закрою это сейчас, потому что не думаю, что сообщается об ошибке в IPython. Может быть, пользователь должен настроить серверную часть без головы, или, может быть, проверка MPL «внутри IPython» также должна проверить, находится ли он в среде без головы. В любом случае, я не думаю, что IPython может что-то сделать, чтобы это исправить.

Не стесняйтесь продолжать использовать этот вопрос как место для его обсуждения.

Да, кажется очевидным, что это не ошибка ipython. Я бы подумал, что MPL должен выполнить проверки, чтобы позволить кому-то запустить оболочку ipython и импортировать matplotlib.pyplot, и это не приведет к сбою, без необходимости изменять какие-либо параметры matplotlibrc или явно устанавливать бэкэнд.

@timothydmorton Проблема заключается в различии между «Пользователь только что попросил использовать бэкэнд с графическим интерфейсом, но они только как-то имели в виду это, и мы должны вернуться к Agg» против «Пользователь только что попросил использовать бэкэнд с графическим интерфейсом, мы не можем поскольку X-sever не запущен, мы должны сообщить им об этом «из строкового ввода». Исторически сложилось так, что компромисс был в пользу интерактивных пользователей и предотвращал ошибку «не обнаружен сюжет» и допускал ошибку «Я не могу использовать интерактивный бэкэнд на безголовом сервере», потому что в последнем случае пользователь получает четкое ошибка относительно того, что не так.

Недавно было некоторое обсуждение того, как поддерживать "какой бы вариант Qt устанавливался" в качестве бэкэнда и как выполнять резервные бэкэнды, но в целом это становится непросто, потому что GUI-фреймворки имеют тенденцию наступать друг другу на пятки, если вы импортируете их одновременно.

Я также столкнулся с этой проблемой, и я не могу придумать хорошей работы, кроме использования обычного python вместо ipython.

@russelljjarvis это незначительное раздражение, но если первая команда, которую вы запускаете при запуске ipython, это import matplotlib; matplotlib.use('agg') тогда ipython должен работать на вас.

Да:

import matplotlib; matplotlib.use('agg')

Это первая команда, которую я выполняю, но все равно получаю:

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

После того, как программа выдает ошибку, и обычно я получаю запрос на отладку и исправление обезьяны.

Я вызываю python с помощью ipython -i file_name.py после первого запуска: ipcluster start -n 8 --profile=default &

Где первая строка file_name - import matplotlib; matplotlib.use('agg')

Интересно, может ли запускаться ipcluster проблемы?

Там это решение с использованием переменных окружения доступны здесь :

Установка export QT_QPA_PLATFORM='offscreen' в моем .bash_profile сработала для меня.

Коллега недавно предложил то же самое. В контексте Docker ваше заявление будет таким:
ENV QT_QPA_PLATFORM offscreen . Сейчас я эффективно проверяю это.

Я получаю ту же ошибку:

Установка export QT_QPA_PLATFORM='offscreen' изменила сообщение об ошибке на:

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

решение прямо в ноутбуке

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

В качестве позднего продолжения, начиная с Matplotlib 3.0, мы теперь поддерживаем автоматический выбор серверной части и не будем пытаться использовать серверную часть с графическим интерфейсом пользователя на автономном сервере (но по-прежнему будем уважать файл rcparams, который просит нас об этом).

Этот ответ https://unix.stackexchange.com/questions/192642/wkhtmltopdf-qxcbconnection-could-not-connect-to-display
Устранено после установки вручную

"conda update matplotlib" устранил проблему для меня.

Следующая настройка действительно работает !!!

экспорт QT_QPA_PLATFORM = 'вне экрана'

В качестве позднего продолжения, начиная с Matplotlib 3.0, мы теперь поддерживаем автоматический выбор бэкэнда и не будем пытаться использовать бэкэнд с графическим интерфейсом пользователя на безголовом сервере (но по-прежнему будем уважать файл rcparams, который просит нас)

Matplotlib 3.1 не может поддерживать автоматический бэкэнд, нам нужно вручную установить Agg.

Это происходит потому, что бэкэнд по умолчанию для Matplotlib в Anaconda - Qt5. Мы планируем изменить его на Tk, чтобы избежать подобных проблем.

где я могу изменить это?

Это моя ошибка после установки 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.

После установки QT_QPA_PLATFORM='offscreen' запускается импорт библиотек matplotlib и fastai.
Однако plt.figure () или любая другая команда, выводящая график, вызывает следующие ошибки:

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

Я тоже получаю эту ошибку

Была ли эта страница полезной?
0 / 5 - 0 рейтинги