Remote display in python? [Ask Astrobetter]

The question:  “How can I remotely display python graphics windows?”

The backstory:  I’m gotten used to the nifty interactive graphics of matplotlib in ipython.  But here it is New Year’s Eve and I’m working from home.  I need to ssh in to my desktop, run python, and remotely display the python graphics windows to my laptop.  This is easy to do in, say, gnuplot (ssh in, and “set terminal x11”), but an hour into reading horrible python docs and stackoverflow, I can’t figure out how to remotely display a python window.

A promising avenue, matplotlib.use(‘GTK’) failed because I can’t get pygtk to install.

17 comments… add one
  • John Dec 31, 2012 @ 12:51

    Without knowing a little more detail about your setup, it’s hard to be completely concrete. But: basically any matplotlib interactive backend with the exception of “macosx” should work easily over an X11 connection. In other words, if:

    1. You have a X server running on your laptop (which you do, if you can run gnuplot);
    2. You have X11 forwarding enabled in SSH (as above);
    3. When sitting at your desktop, which isn’t a Mac, you can use matplotlib interactively,

    then everything should “just work”.

    If your desktop is a Mac, you will probably need to switch the backend to something non-default. It’s a fair bet that the TkAgg backend is installed, and will work just as well as GTK. Try matplotlib.use(“TkAgg”), or, equivalently, invoking:

    $ ipython –pylab=tk

    If that doesn’t help, maybe you could provide some more details about the platform your running on and what, if any, errors are reported.

  • Meg Schwamb Dec 31, 2012 @ 13:25

    I was using python remotely from my work desktop on my mac last night and it was displaying images the graphics over the connection. I didn’t do anything different than what I normally do to log in and forward the display. It sounds more like an X11 forwarding issue possibly. Does showing doing something like xlogo & in the remote terminal pop up a little white window? If not then you’re not forwarding the X11 along for all programs not just python.
    Happy New Year,

  • Yannick Dec 31, 2012 @ 13:28

    Have you tried to use your local ipython but connecting it to the remote ipython kernel via ssh as explained there? →

    • Adam Ginsburg Dec 31, 2012 @ 17:43

      I think this only works for graphical ipython frontends, i.e. qt console or notebook. @Jane, ipython notebooks are one really nice way to interact with a remote machine, but I don’t think this method will work if you want the terminal version of ipython (or if you have ipython <=0.11)

  • Jim Dec 31, 2012 @ 13:32

    I got weary of solving this over and over again from operating system to operating system. So I switched to a remote desktop option. It is not the most efficient if your home internet gets dropouts. But it works for a quick look.

    Typically, I prefer to just mirror the data from home and work, and run the applications on the home system.

  • Jane Dec 31, 2012 @ 13:32

    Desktop and laptop are both macs. X11 and forwarding are working fine (“xterm&” makes a new window on the laptop.)

    $ ipython –pylab=tk gives me the entire ipython help menu, and then “WARNING: Error in Arguments: “Argument ‘-pylab=tk’ occurs multiple times”.

    While matplotlib.use(“TkAgg”) produces this amusing error within ipython:
    In [12]: pylab.plot(x.y)
    Out[12]: [matplotlib.lines.Line2D object at 0x102e3ef50>]

    • John Dec 31, 2012 @ 13:49

      First off: note that you need two hyphens in front of the “pylab” argument to IPython. It looks like the two dashes in my example above have been munged into an en-dash, which won’t work if you copy and paste. That said, it’s possible your version of IPython is too old for this syntax anyway.

      Anyway, the output (not an error!) you quote looks fine. Following the commands above, try simply entering “” — does that do anything?

  • Jane Dec 31, 2012 @ 13:59

    “Does that do anything?” Yup, it brings up a plot on the desktop. (I checked by VNC…)

    • John Dec 31, 2012 @ 14:51

      Weird — no easy answer to that. Are you really running IPython/pylab with exactly the same environment (if possible, in the same terminal, and without running screen or similar) as you can successfully invoke an xterm and have it display on your laptop?

      Try putting the following in a python script and running that in the same terminal:

      import os
      print “Display is: %s” % (os.environ[‘DISPLAY’],)
      import matplotlib
      print “Default backend is: %s” % (matplotlib.get_backend(),)
      print “Backend is now: %s” % (matplotlib.get_backend(),)
      from matplotlib import pyplot

      (save as eg and invoke as “python”). What’s the output?

  • Adam Ginsburg Dec 31, 2012 @ 17:40

    @Jane, @John – I believe the X-forwarding issue has to do with how Tk was installed. You can compile Tk such that it uses Mac-native display windows. @Jane, what icon shows up when you run python? I think if it shows up as anything but part of X11, you can’t get it to forward, but I don’t know.

    I always use VNC for python display, but I tend to run my interactive python terminal from a gnu-screen session, and ssh into my remote machine. So I enter my commands into my local terminal (which is faster and renders more nicely), but I see the graphics windows popping up on the remote machine.

    • John Dec 31, 2012 @ 21:11

      Adam writes:

      > You can compile Tk such that it uses Mac-native display windows

      And I’m sure he’s correctly identified the problem. So, Jane, that means your options are:

      1. Recompile Tk so that it uses X11 rather than Quartz;
      2. Use a different backend which uses X11 (GTK, WX, Qt or FLTK, I guess);
      3. Forget X11, and just use VNC or similar.

      Assuming you didn’t build Tk yourself to begin with but rather are relying on a package provided by somebody else, option 1 is likely tiresome (although see the note on Macports, below).

      You’ve already tried option 2, and run into problems with getting GTK going. You could investigate the other toolkits, but I can’t promise which will be easier.

      Given that you’ve already seen the plot appearing on your work desktop by VNC, I’m inclined to think that option 3 is the easiest in the short term, at least.

      By the way, if you happened to use Macports (see Astrobetter posts passim) to configure your system, switching Tk to use X11 is a snap. All you need is:

      $ sudo port upgrade –enforce-variants tk -quartz +x11

    • Adam Ginsburg Jan 1, 2013 @ 11:41

      BTW, I checked, and non-X11 screen forwarding seems impossible:

    • TMB Jan 3, 2013 @ 1:48

      Related question… anyone have a suggestion how to get pyraf to use an X11-forwardable backend when run on a mac?

  • Carlos Jan 1, 2013 @ 16:21

    Hi Jane,

    Did you try the WX device (backend) already. It seems to work just fine for me. “import matplotlib; matplotlib.use(‘wx’); import matplotlib.pyplot as plt; plt.plot(x,y);”. Also, please, try to connect using the ‘-Y’ option for your SSH connection in place of the usual ‘-X’.
    Hope it helps.

    Happy new year from Brazil 😉

    • Carlos Jan 1, 2013 @ 16:23

      * First frase == question (?)

  • Colette May 3, 2013 @ 21:08

    Did anyone ever figure this out? I’m now trying the same and appear to be having the exact same issues as Jane. I’m running a MacPorts installation that uses native Mac displays which cannot be forwarded. So I’m unable to display matplotlib graphics via ssh. Tried several of the suggestions above but also no luck. I’m still resisting the VNC option and don’t quite know enough to do something more clever than installing a pre-packaged python like the MacPorts version.

  • Jim Doyle Nov 17, 2013 @ 2:06

    Yes, it works for me.

    I’m using tightvncserver on a Raspberry Pi. I used this as a test – works fine – saw the plot on my Windows Vista based vnc client… the matplotlib.use(‘GTK’) might be key. I started ipython like this:
    the –pylab option is key!

    root@Raspyfi:/usr/bin/X11# ipython –pylab

    In [1]: import numpy as np
    In [2]: import matplotlib
    In [3]: matplotlib.use(‘GTK’)
    In [4]: x=np.linspace(0,3*np.pi, 500)
    In [5]: import matplotlib.pyplot as plt
    In [6]: plt.plot(x, np.sin(x**2))

Leave a Reply

Your email address will not be published. Required fields are marked *