No display name and no $DISPLAY environment variable using tkinter through ssh

90,516

Your problem is in ssh command. What you need to do is to write it this way:

ssh -X "your_login"
Share:
90,516
Gabriel
Author by

Gabriel

Updated on July 31, 2020

Comments

  • Gabriel
    Gabriel almost 4 years

    I'm trying to run a very simple code that outputs a .png file in a cluster. Here's the code:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.random.randn(60)
    y = np.random.randn(60)
    
    plt.scatter(x, y, s=20)
    
    out_png = 'path/to/store/out_file.png'
    plt.savefig(out_png, dpi=150)
    

    If I run this code with the command python simple_code.py in my system which has matplotlib 1.2.1 installed I get the warning:

    Unable to load library icui18n "Cannot load library icui18n:
    

    The .png image is still produced so I have no problems here. But if I use the same command and code in a cluster which has matplotlib 1.3.0 installed it fails with the error:

    Traceback (most recent call last):
      File "simple_code.py", line 33, in <module>
        plt.scatter(x, y, s=20)
      File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 3078, in scatter
        ax = gca()
      File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 803, in gca
        ax =  gcf().gca(**kwargs)
      File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 450, in gcf
        return figure()
      File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 423, in figure
        **kwargs)
      File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 79, in new_figure_manager
        return new_figure_manager_given_figure(num, figure)
      File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 87, in new_figure_manager_given_figure
        window = Tk.Tk()
      File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1712, in __init__
        self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
    _tkinter.TclError: no display name and no $DISPLAY environment variable
    

    What is happening here?


    Add, this is the script I use to login into the cluster:

    #!/usr/bin/expect
    
    set login "user"
    set addr "address1"
    set addr2 "address2"
    set pw "password"
    
    spawn ssh -X $login@$addr
    expect "$login@$addr\'s password:"
    send "$pw\r"
    expect "$login@host:"
    send "ssh -X $addr2\r"
    expect "$login@$addr\'s password:"
    send "$pw\r"
    interact
    
  • SethMMorton
    SethMMorton about 10 years
    As an FYI, this was not the solution to the OP's problem. I had suggested in my own answer and then deleted it when the OP told me that it did not fix the problem. The problem identical to the one given here, and it also contains the solution: stackoverflow.com/q/2801882/1399279.
  • Ethan Chen
    Ethan Chen about 7 years
    Just a reminder, ssh -X may at times give you warnings like Warning: untrusted X11 forwarding setup failed: xauth key data not generated in which case you should do ssh -Y instead.
  • Serendipity
    Serendipity about 5 years
    The -Y worked for me (the -X didn't). Thanks @YuxuanChen