【发布时间】:2011-03-28 01:27:47
【问题描述】:
我有一个 python 代码在名为 A 的远程机器上进行一些计算。我通过 ssh 从名为 B 的机器连接到 A。
有没有办法在机器B上显示图形?
【问题讨论】:
标签: python ssh matplotlib
我有一个 python 代码在名为 A 的远程机器上进行一些计算。我通过 ssh 从名为 B 的机器连接到 A。
有没有办法在机器B上显示图形?
【问题讨论】:
标签: python ssh matplotlib
这就是我使用 MacOS 和 Linux 远程机器所做的。
XAuthLocation /opt/X11/bin/xauth
import matplotlib.pyplot as plt
x = [1,2,3]
y = [2,4,1]
plt.plot(x, y)
plt.show()
【讨论】:
如果您使用 mac 作为客户端计算机,请尝试此操作。
您基本上需要确保两件事正常工作。
matplotlib 的后端。matplotlib 的后端如果您使用python3,则必须安装cairocffi。
pip install cairocffi
然后使用 GTK3Agg 作为 matplotlib 的后端。
import matplotlib
matplotlib.use('GTK3Agg')
import matplotlib.pyplot as plt
更多详情请参见matplotlib document 的以下描述。
GTK2 和 GTK3 都隐含依赖于 PyCairo 使用的特定 Matplotlib 后端。不幸的是最新版本 用于 Python3 的 PyCairo 没有实现所需的 Python 包装器 GTK3Agg 后端。 Cairocffi 可以用作替代品 实现正确的包装器。
ssh -X 连接到远程服务器。例如)ssh username@ipaddress -X
【讨论】:
只是想补充一下 - 如果您使用 Windows 作为本地计算机,请确保您已设置 Xming(X Windows 服务器)和 Putty,以便您可以查看远程 Linux 图形应用程序。
我按照这里的说明:http://laptops.eng.uci.edu/software-installation/using-linux/how-to-configure-xming-putty 执行此操作。它还设置您的显示环境和变量,因此在使用tkagg 作为后端时不会出错。
【讨论】:
GTK 似乎无法使用 Python3 在 Ubuntu 上工作。相反,我使用了 tkagg(来自this 答案):
import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt
测试它是否可以使用:
import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.show()
【讨论】:
TclError: no display name and no $DISPLAY environment variable。有什么想法吗?
export MPLBACKEND="agg" 这对我有用。
显然你也可以通过代码来设置它。
【讨论】:
我已经使用 IPython 解决了相关问题。步骤如下:
步骤 1: 使用以下命令在远程机器 (A) 本地安装 IPython 和 Jupyter(假设没有 root 权限):
pip install --user ipython
pip install --user jupyter
更新 matplotlib:
pip install --user -U matplotlib
第 2 步:
从远程机器(A)的代码目录中不使用浏览器运行 Jupyter:
cd PATH/TO/THE/CODE
jupyter notebook --no-browser --port=8080
在此命令之后,将给出一个类似于以下内容的 URL:
http://localhost:8080/?token=5528ab1eeb3f621b90b63420f8bbfc510edf71f21437c4e2
第 3 步:
现在在本地机器 (B) 中打开另一个终端并使用 ssh 连接到远程机器 (A):
ssh -N -L 8080:localhost:8080 user_id@remote.host
步骤 2 和 步骤 3 中的端口号必须相同。在本例中,端口号为 8080。
第 4 步:
将第 3 步中的 URL 复制并粘贴到本地计算机 (B) 的浏览器中。
现在,可以通过浏览器使用远程机器中的笔记本,并可以使用远程机器中的数据生成绘图。
【讨论】:
如果这不起作用,您也可以尝试:
import matplotlib.pyplot as plt
plt.switch_backend('agg')
或
import matplotlib.pyplot as plt
plt.switch_backend('TkAgg')
这似乎对我有用
然而,如果你想让 GUI 工作,我建议你看看这个链接:http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/
【讨论】:
如果您在远程机器 (B) 上的 Mac OS X 上使用 matplotlib,则必须首先确保使用基于 X11 的显示后端之一,因为本机 Mac OS X 后端无法导出其绘制到另一个显示器。选择后端可以通过
import matplotlib
matplotlib.use('GTK') # Or any other X11 back-end
可以通过给use() 一个不正确的后端名称来获得支持的后端列表:matplotlib 然后打印一条错误消息,列出可能的后端。
然后可以使用 ssh X11 转发来显示 matplotlib 图。
【讨论】:
pygtk 来做到这一点,而且用 Python 3 来做到这一点似乎是不可能的或完全痛苦的。
TkAgg 和 GTK3Cairo 后端适用于 Python 3。TkAgg 似乎更快。
-C SSH 标志
以下内容对我在本地机器(机器 B)上使用 Mac OS X 和在远程机器(机器 A)上使用 ubuntu 有效。
您需要在本地计算机上安装 X11 服务器才能执行此操作。
如果您运行的是最新版本的 Mac OSX(OS X Mountain Lion 或更新版本),则不会预装 X11(请参阅 http://support.apple.com/kb/ht5293)。通过打开 Mac 终端检查您是否有 X11,然后运行命令xterm。
如果打开 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
【讨论】:
当然,您可以启用 X11 转发。通常这是通过在连接到远程计算机时将-X 或-Y 选项传递给ssh 来完成的
ssh -X computerA
请注意,计算机 A 上的 SSH 守护程序也必须配置为启用 X11 转发。这是通过放置
X11Forwarding yes
在计算机 A 的 sshd_config 配置文件中。
如果计算机 A 的 SSH 守护进程没有启用 X11 转发,您可以随时让 Python 将计算结果写入文本文件,下载到计算机 B,然后在本地使用 Matplotlib。
【讨论】:
/etc/ssh/sshd_config,请确保重新启动 sshd 和/或 ssh 服务。愚蠢的简单方法是重新启动您的计算机,但是(至少在 linux 上)您也可以使用类似 sudo service sshd restart 的内容重新启动服务,如下所述:cyberciti.biz/faq/howto-start-stop-ssh-server