在 Ubuntu(WSL1 和 WSL2)中显示 matplotlib 图(和其他 GUI)
Show matplotlib plots (and other GUI) in Ubuntu (WSL1 & WSL2)
因此 ubuntu 上 windows(windows 子系统 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 并且只让一个资源管理器 window 打开查看图片。
我想我可以托管该文件夹并使用浏览器。
我的目标是能够 运行 像上面的代码这样的简单示例,而无需将代码更改为 ftp 某处的图像等。我只希望情节显示在 window。
有没有人想出一个合适的方法来做到这一点?
好的,所以我让它按如下方式工作。我在 windows 上安装了 Ubuntu,安装了 anaconda python 3.6。
- 从 sourceforge 下载并安装 VcXsrv or Xming(Windows 的 X11)(参见下面的编辑)
sudo apt-get update
sudo apt-get install python3.6-tk
(根据您使用的 python 版本,您可能需要安装不同的 python*-tk
)
pip install matplotlib
(对于 matplotlib。但许多其他东西现在也可以使用)
export DISPLAY=localhost:0.0
(添加到 ~/.bashrc
以使其永久化。请参阅下面的 WSL2)
无论如何,在 wsl 上 ubuntu 中的这段代码 运行ning 按原样工作:
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 笔记本或其他东西来完成,但是在 Ubuntu 中为 Windows 提供基本命令行 python matplotlib 功能很好 Linux,这使得许多其他图形用户界面应用程序也能正常工作。
例如,您可以安装 xeyes,它会说要安装 x11-apps,安装它会安装许多 GUI 应用程序使用的 GTK。但关键是,一旦您正确设置了 DISPLAY,并且您的 x 服务器在 windows 上,那么大多数可以在本机 ubuntu 上运行的东西也将在 WSL 上运行。
编辑 2019-09-04:今天我在升级一些库后遇到了 'unable to get screen resources' 的问题。所以我安装了 VcXsrv 并使用它代替 Xming。只需从https://sourceforge.net/projects/vcxsrv/和运行xlaunch.exe、select多个windows安装,next next next ok。然后一切正常。
为 WSL 2 用户编辑 2020-06-23
WSL2(目前内幕快环)有 GPU/docker 支持,值得升级。然而它在 vm 中 运行s。对于 WSL 2,按照相同的步骤 1-4 然后:
- IP 不是本地主机。它在 resolv.conf 所以 运行 这个代替(并包含在 ~/.bashrc 中):
export DISPLAY=`grep -oP "(?<=nameserver ).+" /etc/resolv.conf`:0.0
- 现在仔细检查防火墙:Windows 安全 -> 防火墙和网络保护 -> 允许应用程序通过防火墙 -> 确保 VcXsrv 同时选中 public 和私有。 (第一次启动 xlaunch 时,您可能会收到允许通过防火墙的提示。这也有效。此外,如果 VcXsrv 不在应用程序列表中,您可以手动添加它,例如来自 'C:\program files\vcxsrv\vcxsrv.exe')
- 启动 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 }' | head -n 1 | awk '{print [=21=]":0"}')
。然而,对于其他一些人来说,它不起作用。 YMMV,但只要找到您的 IP 并用于显示即可。对于大多数 WSL2 用户,#5 中的命令有效。
编辑 Windows 11:如果 MS 说服您扔掉旧计算机并购买一台带有 TPM 的计算机,那么您得到了 Windows 11 ,您可以免费获得 GUI。我希望他们在 Windows10 上添加升级路径来执行此操作,因为 Win10 将像 XP 一样并且会持续很长时间,因为 MS 决定您需要最新的计算机,即使 Win11 在旧计算机上可以正常工作。
为了让 matplotlib 在 Bash 上 Ubuntu 上 Windows 上与 GTKAgg 一起工作,我:
- 在 Windows 下安装了 VcXsrv(但 Xming 应该可以正常工作)
- 如上所述设置 DISPLAY [
export DISPLAY=localhost:0.0
(添加到 ~/.bashrc 以使其永久化)]
- 已执行
sudo pip uninstall matplotlib
- 接着是
sudo apt install python-matplotlib
- 更新了 matplotlibrc 以读取
backend : GTKAgg
(而不是 backend : agg
)
- 我也运行
sudo apt-get install python-gtk2-dev
,但这可能没有必要。
Uninstalling the pip-installed matplotlib and reinstalling it via apt 似乎是必要的,因为 pip 不包含 运行 GTK 所需的 C 扩展,但 apt 版本包含。
我发现最好的方法是按照
在 Linux (WSL) 的 Windows 子系统上安装 Jupyter
sudo apt update && upgrade
sudo apt install python3 python3-pip ipython3
现在可以安装matplotlib
pip3 install matplotlib
和 Jupyter Notebook
pip3 install jupyter
如果您需要更多信息,请选中此 link Python setup on the Windows subsystem for Linux (WSL)
对于使用 Ubuntu Focal Fossa 版本的 WSL2,我 downloaded 并在 [=56] 上安装了 VcXsrv =].我使用这个配置:
我不知道 Native OpenGL,但禁用访问控制似乎很重要。
现在,您需要在 WSL 中导出环境变量 DISPLAY
。
我在 /etc/resolv.conf
中找到了正确的地址,但在 ifconfig
结果中找到的地址却不是。所以下面的命令对我不起作用:
export DISPLAY=$(ifconfig | grep inet | awk '{print }' | head -n 1 | awk '{print [=10=]":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
。
也可以使用 Visual Studio 代码在 WSL 上查看绘图,截至 2019 年 6 月发布,该代码包括 "Plot Viewer".
在常规 .py 文件中,插入注释字符串 #%%
将代码标记为 Jupyter (IPython) 单元格,并且代码镜头显示 Run Cell
的选项。此外,Python 文件中的 right-clicking 包括选项:
Run Current File in Python Interactive Window
来自 VS Code 2019 年 6 月版:
The June 2019 update included a brand-new Plot Viewer that can be used
to manipulate any image plots, such as the popular matplotlib plots.
You can try it out by double-clicking on the plots or clicking on the
“expand image” button that is displayed when you hover over plot
images in the Python Interactive Window:
With the plot viewer, you can pan, zoom in/out, navigate through plots
in the current session, and export plots to PDF, SVG, or PNG formats.
在我的例子中(Windows 10、WSL2、Ubuntu 20.04 以及 miniconda3 和虚拟环境,我使用 conda
命令安装了所有必需的 Python 3.6 包, Windows-based Visual Studio 带有 'Python' 和 'Remote - WSL' 扩展名的代码)我在 Windows 下安装了 VcXsrv,并添加了
export DISPLAY=$(awk '/nameserver / {print ; exit}' /etc/resolv.conf 2>/dev/null):0
到 Ubuntu 中的 .bashrc
文件。此外,在来自 WSL 的 运行 Python 代码之前,我们必须启动 XLaunch
和 select 'Disable access control'(我也选中了 'Native opengl')。在项目文件夹中,不要将 Python 文件命名为 matplotlib.py
(报告了一些相关问题 here)。
使用 Windows 11 22000,官方支持 Linux GUI 应用程序 开箱即用 前提是满足 pre-requisites。没有调整,没有黑客攻击,没有防火墙更改等
Pre-Requisites:
- Windows 11 Build 22000 或更高版本
- 已安装 vGPU 驱动程序 (Intel/Nvidia/AMD)
然后运行命令
wsl --更新
wsl --shutdown
完成!!
官方来源:https://docs.microsoft.com/en-us/windows/wsl/tutorials/gui-apps
在两个单独的实例中(wsl1 和 wls2 ubuntu 20.04)在使用 PyQt5 时我丢失了几个 libxcb 库(例如 libxcb-icccm4),这些库在尝试绘图时没有打印出来。我使用 export QT_DEBUG_PLUGINS=1
找出哪些,然后简单地安装它们。基本上步骤 here.
因此 ubuntu 上 windows(windows 子系统 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 并且只让一个资源管理器 window 打开查看图片。
我想我可以托管该文件夹并使用浏览器。
我的目标是能够 运行 像上面的代码这样的简单示例,而无需将代码更改为 ftp 某处的图像等。我只希望情节显示在 window。
有没有人想出一个合适的方法来做到这一点?
好的,所以我让它按如下方式工作。我在 windows 上安装了 Ubuntu,安装了 anaconda python 3.6。
- 从 sourceforge 下载并安装 VcXsrv or Xming(Windows 的 X11)(参见下面的编辑)
sudo apt-get update
sudo apt-get install python3.6-tk
(根据您使用的 python 版本,您可能需要安装不同的python*-tk
)pip install matplotlib
(对于 matplotlib。但许多其他东西现在也可以使用)export DISPLAY=localhost:0.0
(添加到~/.bashrc
以使其永久化。请参阅下面的 WSL2)
无论如何,在 wsl 上 ubuntu 中的这段代码 运行ning 按原样工作:
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 笔记本或其他东西来完成,但是在 Ubuntu 中为 Windows 提供基本命令行 python matplotlib 功能很好 Linux,这使得许多其他图形用户界面应用程序也能正常工作。
例如,您可以安装 xeyes,它会说要安装 x11-apps,安装它会安装许多 GUI 应用程序使用的 GTK。但关键是,一旦您正确设置了 DISPLAY,并且您的 x 服务器在 windows 上,那么大多数可以在本机 ubuntu 上运行的东西也将在 WSL 上运行。
编辑 2019-09-04:今天我在升级一些库后遇到了 'unable to get screen resources' 的问题。所以我安装了 VcXsrv 并使用它代替 Xming。只需从https://sourceforge.net/projects/vcxsrv/和运行xlaunch.exe、select多个windows安装,next next next ok。然后一切正常。
为 WSL 2 用户编辑 2020-06-23 WSL2(目前内幕快环)有 GPU/docker 支持,值得升级。然而它在 vm 中 运行s。对于 WSL 2,按照相同的步骤 1-4 然后:
- IP 不是本地主机。它在 resolv.conf 所以 运行 这个代替(并包含在 ~/.bashrc 中):
export DISPLAY=`grep -oP "(?<=nameserver ).+" /etc/resolv.conf`:0.0
- 现在仔细检查防火墙:Windows 安全 -> 防火墙和网络保护 -> 允许应用程序通过防火墙 -> 确保 VcXsrv 同时选中 public 和私有。 (第一次启动 xlaunch 时,您可能会收到允许通过防火墙的提示。这也有效。此外,如果 VcXsrv 不在应用程序列表中,您可以手动添加它,例如来自 'C:\program files\vcxsrv\vcxsrv.exe')
- 启动 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 }' | head -n 1 | awk '{print [=21=]":0"}')
。然而,对于其他一些人来说,它不起作用。 YMMV,但只要找到您的 IP 并用于显示即可。对于大多数 WSL2 用户,#5 中的命令有效。
编辑 Windows 11:如果 MS 说服您扔掉旧计算机并购买一台带有 TPM 的计算机,那么您得到了 Windows 11 ,您可以免费获得 GUI。我希望他们在 Windows10 上添加升级路径来执行此操作,因为 Win10 将像 XP 一样并且会持续很长时间,因为 MS 决定您需要最新的计算机,即使 Win11 在旧计算机上可以正常工作。
为了让 matplotlib 在 Bash 上 Ubuntu 上 Windows 上与 GTKAgg 一起工作,我:
- 在 Windows 下安装了 VcXsrv(但 Xming 应该可以正常工作)
- 如上所述设置 DISPLAY [
export DISPLAY=localhost:0.0
(添加到 ~/.bashrc 以使其永久化)] - 已执行
sudo pip uninstall matplotlib
- 接着是
sudo apt install python-matplotlib
- 更新了 matplotlibrc 以读取
backend : GTKAgg
(而不是backend : agg
) - 我也运行
sudo apt-get install python-gtk2-dev
,但这可能没有必要。
Uninstalling the pip-installed matplotlib and reinstalling it via apt 似乎是必要的,因为 pip 不包含 运行 GTK 所需的 C 扩展,但 apt 版本包含。
我发现最好的方法是按照
在 Linux (WSL) 的 Windows 子系统上安装 Jupytersudo apt update && upgrade
sudo apt install python3 python3-pip ipython3
现在可以安装matplotlib
pip3 install matplotlib
和 Jupyter Notebook
pip3 install jupyter
如果您需要更多信息,请选中此 link Python setup on the Windows subsystem for Linux (WSL)
对于使用 Ubuntu Focal Fossa 版本的 WSL2,我 downloaded 并在 [=56] 上安装了 VcXsrv =].我使用这个配置:
我不知道 Native OpenGL,但禁用访问控制似乎很重要。
现在,您需要在 WSL 中导出环境变量 DISPLAY
。
我在 /etc/resolv.conf
中找到了正确的地址,但在 ifconfig
结果中找到的地址却不是。所以下面的命令对我不起作用:
export DISPLAY=$(ifconfig | grep inet | awk '{print }' | head -n 1 | awk '{print [=10=]":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
。
也可以使用 Visual Studio 代码在 WSL 上查看绘图,截至 2019 年 6 月发布,该代码包括 "Plot Viewer".
在常规 .py 文件中,插入注释字符串 #%%
将代码标记为 Jupyter (IPython) 单元格,并且代码镜头显示 Run Cell
的选项。此外,Python 文件中的 right-clicking 包括选项:
Run Current File in Python Interactive Window
来自 VS Code 2019 年 6 月版:
The June 2019 update included a brand-new Plot Viewer that can be used to manipulate any image plots, such as the popular matplotlib plots.
You can try it out by double-clicking on the plots or clicking on the “expand image” button that is displayed when you hover over plot images in the Python Interactive Window:
With the plot viewer, you can pan, zoom in/out, navigate through plots in the current session, and export plots to PDF, SVG, or PNG formats.
在我的例子中(Windows 10、WSL2、Ubuntu 20.04 以及 miniconda3 和虚拟环境,我使用 conda
命令安装了所有必需的 Python 3.6 包, Windows-based Visual Studio 带有 'Python' 和 'Remote - WSL' 扩展名的代码)我在 Windows 下安装了 VcXsrv,并添加了
export DISPLAY=$(awk '/nameserver / {print ; exit}' /etc/resolv.conf 2>/dev/null):0
到 Ubuntu 中的 .bashrc
文件。此外,在来自 WSL 的 运行 Python 代码之前,我们必须启动 XLaunch
和 select 'Disable access control'(我也选中了 'Native opengl')。在项目文件夹中,不要将 Python 文件命名为 matplotlib.py
(报告了一些相关问题 here)。
使用 Windows 11 22000,官方支持 Linux GUI 应用程序 开箱即用 前提是满足 pre-requisites。没有调整,没有黑客攻击,没有防火墙更改等
Pre-Requisites:
- Windows 11 Build 22000 或更高版本
- 已安装 vGPU 驱动程序 (Intel/Nvidia/AMD)
然后运行命令
wsl --更新
wsl --shutdown
完成!!
官方来源:https://docs.microsoft.com/en-us/windows/wsl/tutorials/gui-apps
在两个单独的实例中(wsl1 和 wls2 ubuntu 20.04)在使用 PyQt5 时我丢失了几个 libxcb 库(例如 libxcb-icccm4),这些库在尝试绘图时没有打印出来。我使用 export QT_DEBUG_PLUGINS=1
找出哪些,然后简单地安装它们。基本上步骤 here.