No display name and no $DISPLAY environment variable using tkinter through ssh [duplicate]
Asked Answered
O

1

30

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
Occupation answered 11/10, 2013 at 2:2 Comment(12)
Are you running this through ssh?Inglis
Yes I am SethMMorton. I set the job and let it run in the cluster through ssh.Occupation
When you call ssh, do you use the -X flag?Inglis
Nope, I just call the ssh twice with no flag. This question I made yesterday explains how I login: unix.stackexchange.com/questions/94334/…Occupation
I added the ssh tag to this post. I think you should change the title to "no display name and no $DISPLAY environment variable using tkinter through ssh" because that's the real problem and more easily searchable for others with the same problem (I don't like changing other people's titles.).Inglis
Done Seth, thanks. Please see my comment in your answer.Occupation
The script you are using is not using the -X flag...Inglis
That's because that is the original script. Let me change it to show how I setup the -X flags as you instructed.Occupation
You should call it like ssh -X ..., not ssh ... -X. That might be the issue.Inglis
That's actually what I tried first and then changed to putting the flag last. That did not work either but I'll edit the question the same.Occupation
I am going to delete my answer and direct you to the following SO question. It's actually almost an exact duplicate of this question. https://mcmap.net/q/98210/-generating-a-png-with-matplotlib-when-display-is-undefined/1399279. It will solve your problem.Inglis
Thank you very much Seth, that has apparently fixed the issue. Cheers.Occupation
E
36

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

ssh -X "your_login"
Efflorescence answered 20/11, 2013 at 17:29 Comment(3)
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: https://mcmap.net/q/98210/-generating-a-png-with-matplotlib-when-display-is-undefined/1399279.Inglis
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.Salvidor
The -Y worked for me (the -X didn't). Thanks @YuxuanChenDenitrify

© 2022 - 2024 — McMap. All rights reserved.