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?
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
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 PNG
s), 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.