当前位置: 首页 > 知识库问答 >
问题:

WSL中未显示Python3绘图

梁丘飞鸾
2023-03-14

我对Python相当陌生。我有一个简单的脚本,在控制台上显示一个简单情节。当我在VSCode中执行脚本时,它可以完美地工作,并且图如预期所示。然而,当在WSL中用Python运行相同的脚本时,该图不会显示,而且我也不会收到任何错误消息。

我使用的是 Windows 10。

这是我在WSL下直接在Python中键入的代码片段:

import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [x**2 for x in x]
plt.plot(x,y)
[<matplotlib.lines.Line2D object at 0x7f57445be700>] # I get this message and I don't know what this means.
plt.show() # No error message, but the plot doesn't show up in my console.

同样,当我在VSCode中执行脚本时,该图显示出来。

如何在 WSL 下显示绘图?

共有1个答案

张卓
2023-03-14

既然你说你的MRE在Visual Studio代码中工作,我猜:

  • 您在VSCode中使用的是Windows版本的Python
  • 或者你在那里使用Jupyter Notebook。

编辑:我刚刚注意到你的评论:

这很有趣,因为当我在常规命令提示符(不是 bash)中运行相同的代码时,情节会显示

所以是的,看起来你也在运行Python的Windows版本。您可以在VSCode中使用WSL,但这似乎不是您在本例中所做的。

在WSL下,您可能需要做几件事,具体取决于您的Windows版本:

> < li>

首先,这里推荐使用Windows 11,因为它包含显示Linux GUI应用程序的内置支持。

Windows 10上的WSL旧版本不直接支持这一点。在Windows 10上,你需要安装第三方X服务器或者使用XRDP。最简单的方法(除了Windows 11)是使用Xfce4 XRDP,但这肯定也是最慢的方法。也可以看我的回答,在Linux的Windows子系统上运行GUI应用程序最简单的方法是什么?.

由于您使用的是Windows 10,因此必须首先在WSL上获得GUI支持。使用xterm之类的工具进行测试,以确保它正常工作),然后返回此处。

<代码>[

我收到这条消息,我不知道这意味着什么。

这很简单。当您直接在Python REPL中输入代码时,它将始终显示每行的值/返回结果。您键入到该点的所有其他行要么没有返回结果,要么将返回值存储在变量中。在文档中,您会注意到来自情节的返回值是“Line2D”对象的列表。

您可以通过简单地将结果存储在变量中来抑制消息,但在REPL中不需要这样做。

plt.show()

没有错误消息,但我的控制台中没有显示该图。

嗯。当我在 WSL 下的基本 Ubuntu 22.04 发行版中尝试这样做时,我确实收到一条错误消息:

<stdin>:1: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.

因为您没有收到错误,所以看起来(从文档中)Matplotlib正在检测某个GUI环境,并因此自动选择一个优先级更高的后端:

如果没有显式设置后端,Matplotlib 会根据系统上可用的内容以及 GUI 事件循环是否已运行自动检测可用的后端。选择以下列表中的第一个可用后端:MacOSX,QtAgg,GTK4Agg,Gtk3Agg,TkAgg,WxAgg,Agg。最后一个是 Agg,是一个只能写入文件的非交互式后端。它在Linux上使用,如果Matplotlib无法连接到X显示器或Wayland显示器。

但我不知道为什么您在该后端没有收到错误(但也没有显示)。运行 plt.get_backend() 以查看 Matplotlib 自动选择了哪个后端可能很有用。对我来说,在新安装的 Ubuntu 上,这很糟糕,但听起来这对你来说会有所不同。

无论如何,这将我们带入下一个可能的步骤——确保启用Matplotlib GUI后端的所有依赖项。这包括:

  • 选定后端所需的Linux库
  • 选定后端所需的Python模块

在典型的Ubuntu安装中,Linux库已经安装好了,因为Linux桌面安装运行的是GUI。然而,Ubuntu/WSL发行版是基于Ubuntu Server的,不包括任何现成的图形应用程序。

假设你想使用 Qt5 后端,这是 Matplotlib 自动选择列表中除 Mac 之外的最高优先级,我们需要安装这些库:

sudo apt install libqt5gui5

然后,根据这个答案,你需要对Qt5的Python支持:

# Don't do this yet.  Read next step.
pip install pyqt5

注意:建议您在虚拟环境(venv)中执行此操作,以免不必要的库“污染”您的系统Python安装。由于您是Python新手,我建议您阅读一下Python虚拟环境,但以下是开始的摘要:

sudo apt install python3-venv
cd <project_dir>
python3 -m venv .venv
source .venv/bin/activate

提示应更改为包含(.venv),以显示环境处于活动状态。

然后,您pip安装的任何内容都将在该虚拟环境中,而不是您的系统环境中:

# Now we can do this "safely"
pip install pyqt5
python3

完成此操作后,请重试代码。希望您现在应该看到 plt.get_backend() 返回 qtAgg。如果没有,则需要进行其他故障排除。

有了这个,<code>plt。plot()应该(对我来说)直接在屏幕上显示绘图。

 类似资料:
  • 使用不再显示控制台上方的绘图窗格的Spyder 4。我已经确保后端设置为内联,但窗格仍然不显示。 如果有人知道任何解决方案,我们将不胜感激。

  • 我最近刚刚在我的新windows计算机上用Ubuntu18.04设置了WSL。我知道要从linux端访问我的windows文件,驱动器被映射到。然而,当我尝试将转换为时,我得到一个。我访问我的窗口和等。从linux端访问也很好,但由于某种原因,似乎是唯一不存在的窗口。

  • 问题内容: 我正在尝试使用PyGObject和python 3编写简单的图形编辑器。我需要使用鼠标绘制具有不同颜色和宽度的线条。我发现类似的例子很多本,但没有更复杂。 如何在“绘制”事件之间保存绘制的图像?是否有增量绘制方式,或者在每个“绘制”事件上都必须重新绘制窗格?我发现可以保存路径,但是如何保存绘制线条的宽度和颜色?有没有办法在’draw’回调之外创建图像并仅在回调内部应用(draw)它?

  • 当我运行以下代码时,即使没有收到任何错误消息,也不会显示绘图。 我试过以下方法:1)更换Spyder- 我正在使用Python 3.6和Anaconda附带的Spyder

  • 我正在尝试用Ubuntu在Linux的Windows子系统上配置。 我也读了以下的帖子,帖子1,帖子2,和其他几个。这些似乎都不能解决我的问题。 任何帮助都将不胜感激。

  • 本文向大家介绍IE6中未显示ReCaptcha,包括了IE6中未显示ReCaptcha的使用技巧和注意事项,需要的朋友参考一下 我今天遇到了ReCaptcha和IE6的一个问题,所以我会写一些有关其他问题的信息(Google上没有很多有关此问题的东西),所以我可以记住什么我将来会做。 我使用的表单是一个多阶段表单,第二部分包含对ReCaptcha函数的调用,该函数recaptcha_get_htm