【问题标题】:Why does this solve the 'no $DISPLAY environment' issue with matplotlib?为什么这可以解决 matplotlib 的“没有 $DISPLAY 环境”问题?
【发布时间】:2015-05-26 20:57:57
【问题描述】:

在我的台式电脑上运行使用matplotlib 库的代码时,我使用以下行没有问题:

import matplotlib.pyplot as plt

远远低于代码,这是我实际使用绘图功能的地方。

如果我在服务器中运行代码,但它只有在我导入matplotlib 之前 才能工作,并强制它使用Agg 后端。即,我必须在代码的开头添加以下几行:

import matplotlib
# Force matplotlib to not use any Xwindows backend.
matplotlib.use('Agg')

(请参阅this answer,其中对此进行了解释)。否则代码会因TclError: no display name and no $DISPLAY environment variable 而崩溃(例如参见this question)。

问题是:为什么我需要这样做?该解决方案完美运行,但我不知道为什么我不必在我的台式电脑上执行此操作,但当代码在服务器中运行时我绝对必须这样做。

【问题讨论】:

  • 你总是可以设置 $DISPLAY export DISPLAY=:0 我认为 ...
  • 我并不是真的在寻找另一种方法来解决这个问题,因为目前的工作效果很好。我想要的是了解它为什么起作用。顺便说一句,我也不太了解您的 cmmt 中的替代解决方案:)
  • DISPLAY 被 UNIX/Linux 上的 X-Windows 系统使用,这不是 matplotlib 或 Python 的错,只是那个平台上的事情。原因是灵活性,可以根据环境变量选择不同的显示器。
  • 您确定您的家用 PC 上没有默认设置 DISPLAY 吗?它通常在 Linux 中设置,因为 GUI 使用它。
  • 你看看你的Linux系统上是否设置了它?使用setenv 命令。它可能在其中一个启动文件中。

标签: python matplotlib x11


【解决方案1】:

X11 遵循客户端/服务器模型,其中 X 服务器接受来自客户端应用程序的图形输出请求(例如交互式 matplotlib 会话),并从键盘、鼠标等发回用户输入。为了使该模型工作,客户端应用程序需要知道将它们的请求发送到哪个 X 服务器。这由$DISPLAY 环境变量控制。如果您连接到远程 X 会话(例如通过 SSH 连接),远程会话中的 $DISPLAY 变量需要指向您的本地 X 服务器。

$DISPLAY 变量的结构如下:

hostname:displaynumber.screennumber

并非所有部分都存在 - 本地会话通常会省略主机名,如果只有一个屏幕,也会省略屏幕编号。在笔记本电脑的本地终端会话中,我的$DISPLAY 如下所示:

alistair@laptop:~$ echo $DISPLAY
:0

如果远程服务器也支持 X11,则可以在远程机器上打开图形窗口,并使用X11 forwarding 让它们出现在本地机器上。对于 SSH 连接,您可以通过传递 -X(或 -Y)标志来执行此操作。

例如:

alistair@laptop:~$ ssh -X alistair@workstation.address.co.uk
alistair@workstation:~$ echo $DISPLAY
localhost:10.0

远程 SSH 服务器应该在您打开连接时适当地设置 $DISPLAY 变量。在这种特殊情况下,localhost:10.0 实际上是在远程机器上运行的“代理”X11 服务器,它在显示器 10 上侦听并通过 SSH 连接将命令中继到本地 X 服务器(take a look at this,如果您对详细信息感兴趣)。

现在您应该能够启动远程 IPython 会话,使用交互式后端导入 matplotlib,并创建随后将出现在本地计算机上的绘图窗口。由于您的键盘/鼠标输入和显示输出现在通过加密的网络连接传递,因此绘图窗口的响应速度将低于您在本地会话中习惯的响应。

另一个警告:如果您打开了一个 IPython 会话并运行了一个交互式 matplotlib 会话,则不可能在不终止 IPython 进程的情况下关闭 SSH 连接。我有时也会在启动导入 matplotlib 的长时间运行进程之前调用 matplotlib.use("Agg") - 这样我就可以在不终止进程的情况下断开与远程服务器的连接。

【讨论】:

    猜你喜欢
    • 2020-12-29
    • 2021-01-17
    • 1970-01-01
    • 2016-01-19
    • 2012-03-28
    • 1970-01-01
    • 2017-02-08
    • 2021-09-06
    相关资源
    最近更新 更多