web-dev-qa-db-fra.com

Aucun nom d'affichage et aucune variable d'environnement $ DISPLAY à l'aide de tkinter via ssh

J'essaie d'exécuter un code très simple qui génère un fichier .png dans un cluster. Voici le 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)

Si je lance ce code avec la commande python simple_code.py dans mon système sur lequel matplotlib 1.2.1 est installé, je reçois l’avertissement:

Unable to load library icui18n "Cannot load library icui18n:

L'image .png est toujours produite, donc je n'ai pas de problème ici. Mais si j'utilise la même commande et le même code dans un cluster sur lequel matplotlib 1.3.0 est installé, il échoue avec l'erreur suivante:

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

Que se passe-t-il ici?


Ajoutez, c'est le script que j'utilise pour me connecter au 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
30
Gabriel

Votre problème est dans la commande ssh. Ce que vous devez faire est de l'écrire de cette façon:

ssh -X "your_login"
35
luturo