【问题标题】:Show matplotlib plots (and other GUI) in Ubuntu (WSL1 & WSL2)在 Ubuntu(WSL1 和 WSL2)中显示 matplotlib 图(和其他 GUI)
【发布时间】:2017-09-09 20:45:34
【问题描述】:

所以似乎在 ubuntu for windows(windows 子系统 for linux)上,人们建议我们需要使用 Agg 后端并且只保存图像,而不是显示绘图。

import matplotlib
matplotlib.use('Agg') # no UI backend

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)
plt.title('About as simple as it gets, folks')

#plt.show()
plt.savefig("matplotlib.png")  #savefig, don't show

我们怎样才能让它到达 plt.show() 实际向我们显示图像的位置?我目前的选择是覆盖 plot.show() ,而只是在 windows 中的 /mnt/c/Users/james/plots/ 下保存一个 plot-148123456.png 并打开一个浏览器窗口来查看图像。

我想我可以托管该文件夹并使用浏览器。

我的目标是能够运行像上面的代码这样的简单示例,而无需将代码更改为 ftp 某处的图像等。我只是希望绘图显示在一个窗口中。

有没有人想出一个体面的方法来做到这一点?

【问题讨论】:

  • @ImportanceOfBeingErnest 据你所知,如果一个人不是 sudoer,那么使用 Jupyter 笔记本的唯一可行选择是什么?
  • 你可以在这里找到一些东西prct.ir/Mno5sHnmw

标签: python linux matplotlib windows-subsystem-for-linux


【解决方案1】:

好的,所以我让它按如下方式工作。我在 Windows 上安装了 Ubuntu,安装了 anaconda python 3.6。

  1. 从 sourceforge 下载并安装 VcXsrvXming(X11 for Windows)(参见下面的编辑)
  2. sudo apt-get update
  3. sudo apt-get install python3.6-tk(您可能需要安装不同的 python*-tk,具体取决于您使用的 python 版本)
  4. pip install matplotlib(用于 matplotlib。但现在许多其他东西也可以使用)
  5. export DISPLAY=localhost:0.0(添加到 ~/.bashrc 以使其永久化。请参阅下面的 WSL2

无论如何,在 wsl 上的 ubuntu 中运行的这段代码按原样运行:

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)

plt.title('About as simple as it gets, folks')
plt.show()

结果:

也许这最好通过 Jupyter notebook 或其他东西来完成,但是在 Linux 子系统上的 Ubuntu for Windows 中具有基本的命令行 python matplotlib 功能非常好,这使得许多其他 gui 应用程序也可以工作。

例如,您可以安装 xeyes,它会说安装 x11-apps,安装它会安装许多 GUI 应用程序使用的 GTK。但关键是,一旦您正确设置了 DISPLAY,并且您的 x 服务器在 windows 上,那么大多数可以在本机 ubuntu 上运行的东西都适用于 WSL。

编辑 2019-09-04:今天我在升级一些库后遇到了“无法获取屏幕资源”的问题。所以我安装了 VcXsrv 并使用它而不是 Xming。只需从https://sourceforge.net/projects/vcxsrv/ 安装并运行xlaunch.exe,选择多个窗口,next next next ok。然后一切正常。

为 WSL 2 用户编辑 2020-06-23 WSL2(目前是内部快速环)具有 GPU/docker 支持,因此值得升级。但是它在vm中运行。对于 WSL 2,请执行相同的步骤 1-4:

  1. ip 不是本地主机。它在 resolv.conf 中,所以改为运行它(并包含在 ~/.bashrc 中):
 export DISPLAY=`grep -oP "(?<=nameserver ).+" /etc/resolv.conf`:0.0
  1. 现在仔细检查防火墙:Windows 安全 -> 防火墙和网络保护 -> 允许应用程序通过防火墙 -> 确保 VcXsrv 已检查公共和私人。 (第一次启动 xlaunch 时,您可能会收到允许通过防火墙的提示。这也有效。此外,如果 VcXsrv 不在应用程序列表中,您可以手动添加它,例如从 'C:\program files\vcxsrv\vcxsrv .exe')
  2. 启动 VcXsrv 并勾选“禁用访问控制”

注意:一些 WSL2 用户收到类似 couldn't connect to display "172.x.x.x:0" 的错误。如果是这样,您尝试使用以下命令检查存储在 DISPLAY 中的 IP 地址:echo $DISPLAY。如果显示的 IP 似乎是错误的(即“8.8.8.8”或另一个不工作的 IP 地址),您需要将第 5 点中显示的 ~/.bashrc 中的代码更改为可以获取实例 IP 地址的内容。一位用户说这有效:export DISPLAY=$(ifconfig | grep inet | awk '{print $2}' | head -n 1 | awk '{print $0":0"}')。然而,对于其他一些人来说,它不起作用。 YMMV,但只需找到您的 IP 并将 if 用于 DISPLAY。对于大多数 WSL2 用户,#5 中的命令有效。

为 Windows 11 编辑:如果 MS 说服你扔掉你的旧电脑并购买一台带有 TPM 的电脑,这样你就获得了 Windows 11,你就可以免费获得 GUI。我希望他们添加升级路径以在 Windows 10 上执行此操作,因为 Win10 将像 XP 一样持续很长时间,因为 MS 决定您需要最近的计算机,即使 Win11 在旧计算机上可以正常工作。

【讨论】:

  • 我只需要在 windows 端安装 xming 并在 ubuntu 端安装 sudo apt-get install python-tk - 然后我在设置 DISPLAY 后就可以了。
  • @AlistairH 你把 DISPLAY 设置成什么?
  • DISPLAY=localhost:0.0,如上面的答案。
  • 当我的代码中还有mpl.use('Agg') 时,它对我不起作用。我删除了它,现在它可以正常工作了。
  • 按照建议的步骤对我有用。唯一的区别是现在您可以安装 python3-tk(而不是指定您的特定版本的 python3)。非常感谢!
【解决方案2】:

在 Windows 11 22000 中,Linux GUI 应用程序得到正式支持开箱即用,前提是满足先决条件。没有调整、没有黑客攻击、没有防火墙更改等。

先决条件:

  1. Windows 11 Build 22000 或更高版本
  2. 为 vGPU (Intel/Nvidia/AMD) 安装驱动程序

然后运行命令
wsl --更新
wsl --shutdown

完成!!

官方来源:https://docs.microsoft.com/en-us/windows/wsl/tutorials/gui-apps

【讨论】:

  • 是的,这很好,但是很多人都在等到 MS 取消 TPM 芯片要求后再使用 Windows 11。也就是说,Windows 10 会像 XP 一样存在很长时间。
【解决方案3】:

就我而言(Windows 10、WSL2、带有 miniconda3 的 Ubuntu 20.04 和虚拟环境,我使用 conda 命令安装了所有必需的 Python 3.6 包,带有“Python”和“Remote - WSL”的基于 Windows 的 Visual Studio 代码extensions) 我在 Windows 下安装了 VcXsrv,并添加了

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0

到 Ubuntu 中的 .bashrc 文件。此外,在从 WSL 运行 Python 代码之前,我们必须启动 XLaunch 并选择“禁用访问控制”(我也选中了“本机 opengl”)。在项目文件夹中,不要将Python文件命名为matplotlib.py(一些相关问题报告here)。

【讨论】:

    【解决方案4】:

    还可以使用 Visual Studio Code 在 WSL 上查看绘图,自 2019 年 6 月发布以来,该代码包括"Plot Viewer"

    在常规 .py 文件中,插入注释字符串 #%% 将代码标记为 Jupyter (IPython) 单元格,代码镜头显示 Run Cell 的选项。此外,在 Python 文件中右键单击包括以下选项:

    在 Python 交互窗口中运行当前文件

    来自 VS Code 2019 年 6 月版:

    2019 年 6 月的更新包括一个全新的绘图查看器,可以使用 操作任何图像图,例如流行的 matplotlib 图。

    您可以通过双击绘图或单击 将鼠标悬停在绘图上时显示的“展开图像”按钮 Python 交互窗口中的图像:

    使用绘图查看器,您可以平移、放大/缩小、浏览绘图 在当前会话中,并将绘图导出为 PDF、SVG 或 PNG 格式。

    【讨论】:

    • #%% +1,对于wsl,它是一种非常简单的绘图方法。
    【解决方案5】:

    对于使用 Ubuntu Focal Fossa 版本的 WSL2,我 downloaded 并在 Windows 上安装了 VcXsrv。我使用这个配置:

    我不知道 Native OpenGL 但禁用访问控制似乎很重要。

    现在,您需要在 WSL 中导出环境变量 DISPLAY

    我在/etc/resolv.conf 中找到了正确的地址,但在ifconfig 结果中找到的地址不正确。所以下面的命令对我不起作用

    export DISPLAY=$(ifconfig | grep inet | awk '{print $2}' | head -n 1 | awk '{print $0":0"}')
    

    该 IP 地址也可以在命令 ipconfig 中找到 CMD.exe 命令上下文。搜索vEthernet (WSL),应该就是那个。

    现在,您只需在 WSL 环境中执行 xcalc 即可测试一切是否正常。如果 xcalc 不存在,请安装它:

    sudo apt-get update && sudo apt-get install x11-apps
    

    xcalc 命令应该在 Windows 上打开一个如下所示的应用程序:

    如果它正常工作,则表示可以连接到您的 X-server,但您可能需要为 Python 安装一些额外的包,例如:

    sudo apt-get install python3.x-tk
    

    根据你的python版本更改.x

    【讨论】:

    • 您的回答很有帮助。只有在我使用 ipconfig 检查了 CMD 中与 WSL 相关的 IP 地址之后,我才能正确设置 DISPLAY 变量。
    • 关于sudo apt-get install python3.x-tk命令,在Ubuntu 20.04终端指定python3.8-tk,终于得到包管理器Note, selecting 'python3-tk' instead of 'python3.8-tk'的回复。因此,似乎只指定一个主要的 Python 版本很重要。
    【解决方案6】:

    我发现最好的方法是按照以下步骤在 Windows Subsystem for Linux (WSL) 上安装 Jupyter

    sudo apt update && upgrade
    sudo apt install python3 python3-pip ipython3
    

    现在你可以安装 matplotlib

    pip3 install matplotlib
    

    还有 Jupyter 笔记本

    pip3 install jupyter
    

    如果您需要更多信息,请查看此链接Python setup on the Windows subsystem for Linux (WSL)

    【讨论】:

      【解决方案7】:

      为了让 matplotlib 在 Windows 上的 Ubuntu 上的 Bash 上与 GTKAgg 一起工作,我:

      1. 在 Windows 下安装了 VcXsrv(但应该与 Xming 一样)
      2. 如上所述设置 DISPLAY [export DISPLAY=localhost:0.0(添加到 ~/.bashrc 以使其永久化)]
      3. 已执行sudo pip uninstall matplotlib
      4. 后跟sudo apt install python-matplotlib
      5. 将 matplotlibrc 更新为读取 backend : GTKAgg(而不是 backend : agg
      6. 我也跑了sudo apt-get install python-gtk2-dev,但这可能没有必要。

      Uninstalling the pip-installed matplotlib and reinstalling it via apt 似乎是必要的,因为 pip 不包含运行 GTK 所需的 C 扩展,但 apt 版本包含。

      【讨论】:

      • python 文件顶部:导入 matplotlib; matplotlib.use('GTKAgg');不要忘记启动 VcXsrc。我跳过了第 6 步。谢谢!
      • @Jason:我更新了我的matplotlibrc(第5 步),以便默认使用GTKAgg,而不是显式设置matplotlib use 属性,但我喜欢你的变体。另外,关于验证 VcXsvr 是否正在运行的要点。很高兴我能帮上忙!
      • 请注意,mobaXtrem 有内置的 xserver,可以用来代替安装VcXsrv。见nickjanetakis.com/blog/…
      • @oak:这是如何改进的? MobaXTerm 只是一个不同的第三方 XServer。
      • 嗯,基本上你是对的,只是我已经准备好运行 MobaXTrem,所以它为我保存了安装的新软件。
      猜你喜欢
      • 2020-10-10
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      相关资源
      最近更新 更多