web-dev-qa-db-fra.com

tkinter.TclError: impossible de se connecter pour afficher "localhost: 18.0"

J'essayais d'exécuter une simulation (écrite en python) sur le serveur central, et lorsque la simulation est terminée, déplacez le fichier de figure enregistré/fichier de données enregistré sur mon PC local, en me connectant à mon PC local. Le code est le suivant:

import matplotlib.pyplot as plt
import subprocess
import scipy.io
import os

#Save data file:
scipy.io.savemat(data_path + Filename_str, dict(A=board))

#Create / Save figure by using imshow (Heatmap)
p = plt.imshow(mean_map.T, cmap = plt.cm.Gist_yarg_r, Origin = 'lower',  extent = [0, phi, 0, Z], aspect='auto')
plt.savefig(figure_path + Filename_str + '-Homophily.pdf')

# Connect to my local Host (arabian-knights) using ssh, and follow command.
ret = subprocess.call(['ssh', 'arabian-knights', 'mv Data/* /scratch/Data/'])
ret = subprocess.call(['ssh', 'arabian-knights', 'mv Figure/* /scratch/Figure/'])

J'exécute cette simulation en arrière-plan de l'ordinateur serveur, après m'être connecté à l'ordinateur serveur à partir de mon ordinateur local (arabian-knights). Même si je désactive la connexion à l'ordinateur serveur, car la simulation s'exécute en arrière-plan, elle ne s'arrête pas et les fichiers de données sont correctement déplacés vers mon ordinateur local une fois la simulation terminée. Cependant, les fichiers de figure (produits par matplotlib.pyplot.imshow ) ne sont pas enregistrés, affichant le message d'erreur suivant:

Traceback (most recent call last):
  File "./ThrHomoHeatmap-thrstep.py", line 179, in <module>
    p = plt.imshow(board.T, cmap = plt.cm.Gist_yarg_r, vmin=0, vmax=n, Origin = 'lower',  extent = [0, phi, 0, Z], aspect='auto')
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2370, in imshow
    ax = gca()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 701, in gca
    ax =  gcf().gca(**kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 369, in gcf
    return figure()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 343, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 80, in new_figure_manager
    window = Tk.Tk()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1688, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display "localhost:18.0"

Y a-t-il quelqu'un qui peut résoudre ce problème, pour déplacer également les fichiers de figure matplotlib.pyplot du serveur vers l'ordinateur local?

30
user2901339

Le problème est que vous utilisez un backend interactif qui essaie de créer des fenêtres de figures pour vous, qui échouent parce que vous avez déconnecté le x-server qui était disponible lorsque vous avez démarré les simulations.

Modifiez vos importations en

import matplotlib
matplotlib.use('pdf')
import matplotlib.pyplot as plt
24
tacaswell

Générez des images sans qu'une fenêtre n'apparaisse ( fond )

utiliser un backend non interactif (voir Qu'est-ce qu'un backend ?) tel que Agg (pour PNGs), PDF, SVG ou PS. Dans votre script générateur de figures, il suffit d'appeler la directive matplotlib.use() avant d'importer pylab ou pyplot:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.savefig('myfig')

Remarque : Cette réponse a été brièvement mentionnée dans un commentaire. Je l'ai mis ici comme réponse pour augmenter la visibilité car cela m'a aidé et j'ai eu la chance d'avoir décidé de lire les commentaires.

13
mrk