Linux服务器运行matplotlib代码plt.show()无法显示图像
问题原因
出现这个问题的核心原因是你当前使用的Linux服务器是纯命令行无图形界面环境,matplotlib默认的交互后端无法完成窗口渲染:
- 本地VSCode运行时,机器自带桌面图形环境,matplotlib会自动调用TkAgg/Qt5Agg这类带窗口交互能力的后端,直接弹出图像窗口
- 无桌面的Linux服务器默认没有部署X11图形显示服务,
plt.show()找不到可用的显示输出通道,既不会报错也不会弹出图像,通常会直接静默卡住。
解决方法
根据你的使用需求选对应方案即可:
- 方案1:不需要实时弹窗,直接保存图像到本地(最通用,无额外依赖)
无GUI环境下直接把matplotlib切换为非交互的Agg渲染后端,不需要调用图形窗口,渲染完成后直接把图像写入文件即可。注意:后端设置代码必须在导入pyplot之前执行,否则不生效。
调整后可直接运行的代码:
import torch
import torchvision
import torchvision.transforms as transforms
import numpy
import matplotlib
提前设置非交互渲染后端
matplotlib.use('Agg')
import matplotlib.pyplot as plt
torch.set_printoptions(linewidth=120)
train_set = torchvision.datasets.FashionMNIST(
root='./data/FashionMNIST',
train=True,
download=True,
transform=transforms.Compose([
transforms.ToTensor()
])
)
train_loader = torch.utils.data.DataLoader(
train_set, batch_size=10
)
sample = next(iter(train_set))
image, label = sample
plt.imshow(image.squeeze(), cmap='gray')
替换原plt.show()逻辑,将渲染结果保存为图片文件
plt.savefig('./fashion_mnist_sample.png')
print(f"label:{label}")
运行完成后会在代码执行目录生成`fashion_mnist_sample.png`文件,通过scp、sftp等方式把文件传到本地电脑就能查看。 - 方案2:服务器端使用Jupyter类交互式笔记环境 直接在代码最开头加`%matplotlib inline`魔法命令,不需要修改其他代码,图像会直接内嵌在笔记的输出单元格中展示,不需要弹窗也不需要手动存文件。 - 方案3:需要和本地运行一致的实时弹窗效果 配置X11转发,把服务器端的图形输出转发到本地机器显示: 1. 本地机器安装X11服务端:Windows系统安装VcXsrv,Mac系统安装XQuartz,安装完成后启动X11服务保持后台运行 2. SSH连接服务器时加上X11转发参数:`ssh -X 你的用户名@服务器IP` 3. 服务器端安装基础图形依赖:Debian/Ubuntu系执行`sudo apt update && sudo apt install python3-tk x11-apps`,CentOS/RHEL系执行`sudo dnf install python3-tkinter xorg-x11-apps` 4. 配置完成后直接运行原代码,图像窗口会直接弹出在你的本地桌面上。 内容的提问来源于stack exchange,提问作者Arist12
相关产品推荐
相关产品推荐

