【问题标题】:Matplotlib: display plot on a remote machineMatplotlib:在远程机器上显示绘图
【发布时间】:2011-03-28 01:27:47
【问题描述】:

我有一个 python 代码在名为 A 的远程机器上进行一些计算。我通过 ssh 从名为 B 的机器连接到 A。 有没有办法在机器B上显示图形?

【问题讨论】:

标签: python ssh matplotlib


【解决方案1】:

这就是我使用 MacOS 和 Linux 远程机器所做的。

  1. 在 ~/.ssh/config 我添加了以下内容。我添加这个是因为您的机器可能没有正确获取 xauth 位置。
    XAuthLocation /opt/X11/bin/xauth
  1. ssh -Y machine_name
  2. 运行以下虚拟程序:
    import matplotlib.pyplot as plt
    x = [1,2,3]
    y = [2,4,1]
    plt.plot(x, y)
    plt.show()

【讨论】:

    【解决方案2】:

    如果您使用 mac 作为客户端计算机,请尝试此操作。

    您基本上需要确保两件事正常工作。

    • 使用 GTK 或 Cairo 作为 matplotlib 的后端。
    • 转发显示。

    使用 GTK 或 Cairo 作为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 可以用作替代品 实现正确的包装器。

    转发显示

    1. 安装启动最新版本的 XQuartz。
    2. 使用ssh -X 连接到远程服务器。例如)ssh username@ipaddress -X

    【讨论】:

      【解决方案3】:

      只是想补充一下 - 如果您使用 Windows 作为本地计算机,请确保您已设置 Xming(X Windows 服务器)和 Putty,以便您可以查看远程 Linux 图形应用程序。

      我按照这里的说明:http://laptops.eng.uci.edu/software-installation/using-linux/how-to-configure-xming-putty 执行此操作。它还设置您的显示环境和变量,因此在使用tkagg 作为后端时不会出错。

      【讨论】:

        【解决方案4】:

        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()
        

        【讨论】:

        • 我在使用 gtk 和 qt 时遇到了很多麻烦,但效果很好!
        • 这给了我:TclError: no display name and no $DISPLAY environment variable。有什么想法吗?
        • 使用 python 3.6 绝对解决了我的问题。不幸的是,显示图像的速度真的很慢,关于如何提高速度的任何想法。我使用 ssh -Y -C 访问我的远程机器。
        【解决方案5】:

        export MPLBACKEND="agg" 这对我有用。 显然你也可以通过代码来设置它。

        【讨论】:

          【解决方案6】:

          我已经使用 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) 的浏览器中。

          现在,可以通过浏览器使用远程机器中的笔记本,并可以使用远程机器中的数据生成绘图。

          【讨论】:

          • 这并不是对原始问题的直接回答,但它是一个非常有利的解决方法。如果您将数字保存在远程机器上,您甚至可以在笔记本查看器中打开它们! imo 使用 jupyter lab 会更好。
          【解决方案7】:

          如果这不起作用,您也可以尝试:

          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/

          【讨论】:

          • 欢迎来到Stack Overflow。虽然添加链接可能会回答问题,但最好在此处包含链接的基本部分并提供链接以供参考。
          【解决方案8】:

          如果您在远程机器 (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 来做到这一点似乎是不可能的或完全痛苦的。
          • 这绝对取决于您的平台和包管理器。在 macOS 上,MacPorts 有一个 py27-pygtk 包,它应该可以使 Python 2 的安装顺利。
          • @sudo 我检查了所有支持的后端。就我而言,TkAggGTK3Cairo 后端适用于 Python 3。TkAgg 似乎更快。
          • 如果速度是一个问题,我推荐-C SSH 标志
          【解决方案9】:

          以下内容对我在本地机器(机器 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

          【讨论】:

            【解决方案10】:

            当然,您可以启用 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
            • 如果您编辑 /etc/ssh/sshd_config,请确保重新启动 sshd 和/或 ssh 服务。愚蠢的简单方法是重新启动您的计算机,但是(至少在 linux 上)您也可以使用类似 sudo service sshd restart 的内容重新启动服务,如下所述:cyberciti.biz/faq/howto-start-stop-ssh-server
            • Gilles here 提供了关于此主题的其他有用建议。
            猜你喜欢
            • 2014-03-09
            • 2022-06-14
            • 1970-01-01
            • 1970-01-01
            • 2012-06-05
            • 1970-01-01
            • 2016-12-30
            • 1970-01-01
            • 2015-05-04
            相关资源
            最近更新 更多