Matplotlib:在远程机器上显示图表

79 投票
12 回答
124676 浏览
提问于 2025-04-16 02:36

我有一段Python代码,它在一台叫做A的远程机器上进行一些计算。我是通过从另一台叫做B的机器上使用ssh连接到A的。请问有没有办法把计算结果的图形显示在B上呢?

12 个回答

24

以下内容是我在本地机器(机器B)上使用Mac OS X,以及在远程机器(机器A)上使用Ubuntu时的经验。

要做到这一点,你的本地机器上需要安装X11服务器。

如果你使用的是较新的Mac OSX版本(比如OS X Mountain Lion或更新的版本),那么它是不会自带X11的(可以查看 http://support.apple.com/kb/ht5293)。你可以通过打开Mac的终端,运行命令 xterm 来检查是否有X11。如果打开了一个X11窗口,那就没问题。如果提示找不到命令,那就去 http://xquartz.macosforge.org/landing/ 安装X11服务器。安装完后,记得注销再重新登录你的Mac。

重新登录后,再次尝试运行 xterm 命令。应该能打开X11窗口。此时你的 $DISPLAY 变量也应该设置正确。如果没有设置,确保你在安装XQuartz的X11后进行了注销和重新登录。

echo $DISPLAY
/tmp/launch-I9I3aI/org.macosforge.xquartz:0

然后在你的本地机器上,使用 ssh -X 连接到远程机器A:

ssh -X user@machineA

接下来在远程机器上:

python
>>> import matplotlib
>>> matplotlib.use('GTKAgg')  #I had to use GTKAgg for this to work, GTK threw errors
>>> import matplotlib.pyplot as plt  #...  and now do whatever you need...

确保在导入其他任何 matplotlib 的内容之前,先调用 matplotlib.use(例如 matplotlib.pyplot)。

关于使用 ssh -X 的其他有用的故障排除提示,可以参考这个链接: http://oroborosx.sourceforge.net/remotex.html#usessh

40

当然,你可以启用X11转发。通常在连接远程计算机时,可以通过在ssh命令后面加上-X-Y选项来实现。

ssh -X computerA

需要注意的是,计算机A上的SSH服务也必须配置为启用X11转发。这可以通过在计算机A的sshd_config配置文件中添加

X11Forwarding yes

来完成。

如果计算机A的SSH服务没有启用X11转发,你可以让Python把计算结果写入一个文本文件,然后下载到计算机B上,再在本地使用Matplotlib进行处理。

35

如果你在远程机器(A)上使用Mac OS X的matplotlib,首先要确保你使用的是基于X11的显示方式,因为Mac OS X自带的显示方式无法把图表导出到其他显示器上。选择显示方式可以通过以下方式实现:

import matplotlib
matplotlib.use('GTK')  # Or any other X11 back-end

你可以通过给use()一个错误的显示方式名称来获取支持的显示方式列表:matplotlib会打印出一个错误信息,列出所有可能的显示方式。

然后可以使用ssh的X11转发功能来显示matplotlib的图表(具体可以参考David Z的回答)。

撰写回答