Ipython: QXcbConnection:无法连接到显示器

创建于 2017-05-31  ·  32评论  ·  资料来源: ipython/ipython

当我创建一个全新的 conda 环境时:

conda create --name test ipython matplotlib

然后尝试从 ipython 中import matplotlib.pyplot ,我得到以下信息:

In [1]: import matplotlib.pyplot

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

当我在 vanilla python shell 中运行它时没有问题。 py2.7.13 (ipython 5.3.0) 和 py3.6.1 (ipython 6.0.0) 都会发生。

我不知道这是 ipython 错误还是 conda 错误,所以我首先提出了anaconda问题,但我也想在这里指出。

最有用的评论

还有使用环境变量可用的解决方案在这里

在我的.bash_profile设置export QT_QPA_PLATFORM='offscreen'对我有用。

所有32条评论

您能检查一下 IPython 中的os.environ['DISPLAY']与 vanilla Python shell 中的相同吗?

我想可能是 matplotlib 选择了不同的后端,但我不确定为什么会这样做。

对 - 我忘了提到我在没有显示器的集群头节点上运行它。 所以没有 $DISPLAY 集( os.environ['DISPLAY'] KeyError在两个外壳上都给出了

如果我明确地将后端设置为'agg'我也不会收到错误,但我想避免每次启动 ipython 并想要导入导入 matplotlib 的东西时都必须这样做。

您是使用 IPython 终端接口还是 IPython 作为 Jupyter 接口中的内核? 我认为 IPython 作为内核设置MPLBACKEND环境变量以默认生成内联图,但在终端中使用 IPython 不应该发生这种情况。 无论如何,我认为内联图不需要 X 服务器。 :-/

我只是在使用 ipython 终端界面。 看起来如果DISPLAY不可用,那么后端应该默认为不需要它的东西,但这似乎并没有发生。

@tacaswell知道为什么 IPython 可能会影响这里的默认后端吗?

发生这种情况是因为 Anaconda 中 Matplotlib 的默认后端是 Qt5。 我们正在考虑将其更改为 Tk 以避免此类问题。

更改为 Tk 仍然会有同样的问题。

我认为它会立即与 IPython vs python 一起出现,因为如果 pyplot 被导入到 IPython 内部,它会注意到并设置事件循环集成。 在普通提示中,当用户尝试绘制绘图时,您最终会遇到问题。

我认为将 tk 作为默认值会不太好。

我认为将 tk 作为默认值会不太好。

你是什​​么意思? 你认为 Anaconda 留在 Qt5 更好吗?

Qt5 是一个更好的框架,并且开箱即用地支持 hi-dpi 屏幕,我认为回到 Tk 将是用户体验的倒退。

好的,我们只是有点担心在无头 Docker 容器中运行的笔记本。 但是使用 Matplotlib 1.5(我认为),笔记本会自动选择inline作为其默认后端,对吗?

这完全是在 jupyter 方面。

如果MPLBACKEND环境变量尚未设置,ipykernel 会将其设置为引用内联后端。 我们源代码中的注释说这会影响 mpl >= 1.5,并且它优先于 matplotlibrc 但不会超过在代码中明确选择后端。

这太酷了! 然后我会说这可以关闭。

OP 可以简单地在他的 matplotlibrc 中将 'agg' 设置为 Matplotlib 的默认后端,以避免此错误。

重新阅读本文,我注意到它最初是关于终端 IPython,而不是内核。 我上面关于设置 MPLBACKEND 的内容不适用于终端 IPython。

我现在将关闭它,因为我认为报告的内容不是 IPython 中的错误。 也许由用户来配置无头后端,或者 MPL 的“内部 IPython”检查也应该检查它是否在无头环境中。 无论哪种方式,我都认为 IPython 无法修复它。

不过,请随意继续使用这个问题作为讨论它的地方。

是的,它不是 ipython 错误似乎很明显。 我认为 MPL 应该进行检查以允许某人启动 ipython shell 并导入 matplotlib.pyplot,并且不会崩溃,而无需更改任何 matplotlibrc 选项或明确设置后端。

@timothydmorton问题在于“用户只是要求使用 GUI 后端,但他们只是有点意思,我们应该回退到 Agg”与“用户只是要求使用 GUI 后端,我们不能”之间的区别因为没有 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

在程序遇到错误后,通常我会提示调试和猴子补丁。

我在第一次运行后用ipython -i file_name.py调用 python: ipcluster start -n 8 --profile=default &

file_name 的第一行是import matplotlib; matplotlib.use('agg')

我想知道是否运行 ipcluster 可能会导致问题。

还有使用环境变量可用的解决方案在这里

在我的.bash_profile设置export QT_QPA_PLATFORM='offscreen'对我有用。

最近一位同事提出了同样的建议。 在 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 开始,我们现在支持自动后端选择,并且不会尝试在无头服务器上使用 GUI 后端(但仍会尊重要求我们这样做的 rcparams 文件)。

“conda update matplotlib”为我解决了这个问题。

以下设置有效!!!

导出 QT_QPA_PLATFORM='屏幕外'

作为后期跟进,从 Matplotlib 3.0 开始,我们现在支持自动后端选择,并且不会尝试在无头服务器上使用 GUI 后端(但仍会尊重要求我们这样做的 rcparams 文件)

Matplotlib 3.1 不支持自动后端,需要手动设置 'Agg' 。

发生这种情况是因为 Anaconda 中 Matplotlib 的默认后端是 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 等级