J'ai un code python qui effectue des calculs sur une machine distante, nommée A. Je me connecte sur A via ssh
à partir d'une machine nommée B . Existe-t-il un moyen d'afficher la figure sur la machine B?
Si vous utilisez matplotlib sur Mac OS X sur la machine distante (B), vous devez d’abord vous assurer d’utiliser l’un des back-ends à affichage X11, car le back-end natif de Mac OS X ne peut pas exporter ses tracés afficher. La sélection d’un back-end peut être réalisée avec
import matplotlib
matplotlib.use('GTK') # Or any other X11 back-end
La liste des back-ends supportés peut être obtenue en donnant à use()
un nom de back-end incorrect: matplotlib affiche ensuite un message d'erreur listant les back-end possibles.
ssh X11 forwarding peut ensuite être utilisé pour afficher des graphes matplotlib.
Bien sûr, vous pouvez activer le transfert X11. Cela se fait généralement en passant l'option -X
ou -Y
à ssh
lorsque vous vous connectez à l'ordinateur distant.
ssh -X computerA
Notez que le démon SSH sur l'ordinateur A devra également être configuré pour activer le transfert X11. Ceci est fait en mettant
X11Forwarding yes
dans le fichier de configuration sshd_config
de l'ordinateur A.
Si le transfert X11 n'est pas activé dans le démon SSH de l'ordinateur A, vous pouvez toujours demander à Python d'écrire le résultat du calcul dans un fichier texte, de le télécharger sur l'ordinateur B et d'utiliser Matplotlib localement.
Ce qui suit a fonctionné pour moi en utilisant Mac OS X sur la machine locale (machine B) et ubuntu sur la télécommande (machine A).
Pour ce faire, un serveur X11 doit être installé sur votre ordinateur local.
Si vous utilisez une version récente de Mac OSX (OS X Mountain Lion ou plus récent), il n’aurait PAS été fourni avec X11 préinstallé (voir http://support.Apple.com/kb/ht5293 ). . Vérifiez si vous avez X11 en ouvrant un terminal Mac et exécutez la commande xterm
. Si une fenêtre X11 s'ouvre, vous êtes prêt. Si la commande est introuvable, accédez à http://xquartz.macosforge.org/landing/ et installez le serveur X11. Ensuite, déconnectez-vous et reconnectez-vous à votre Mac.
Après vous être reconnecté, essayez de réexécuter la commande xterm
. Il devrait ouvrir la fenêtre X11 . À ce stade, votre variable $ DISPLAY devrait également être définie correctement. Si ce n'est pas le cas, assurez-vous que vous êtes connecté/déconnecté depuis l'installation de X11 à partir de XQuartz.
echo $DISPLAY
/tmp/launch-I9I3aI/org.macosforge.xquartz:0
Ensuite, à partir de votre machine locale, utilisez ssh -X pour vous connecter à la machine distante A:
ssh -X user@machineA
Puis sur la machine distante:
python
>>> import matplotlib
>>> matplotlib.use('GTKAgg') #I had to use GTKAgg for this to work, GTK threw errors
>>> import matplotlib.pyplot as plt #... and now do whatever you need...
Assurez-vous d'appeler matplotlib.use
AVANT d'importer quoi que ce soit de matplotlib
(par exemple matplotlib.pyplot
)
Autres conseils de dépannage utiles sur l’utilisation de ssh -X: http://oroborosx.sourceforge.net/remotex.html#usessh
GTK semble impossible de travailler sur Ubuntu avec Python3. Au lieu de cela, j'ai utilisé tkagg (de this answer):
import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt
tester avec ceci:
import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.show()
si cela ne fonctionne pas, vous pouvez aussi essayer:
import matplotlib.pyplot as plt
plt.switch_backend('agg')
ou
import matplotlib.pyplot as plt
plt.switch_backend('TkAgg')
cela semblait fonctionner pour moi
Cependant, si vous essayez de faire fonctionner une interface graphique, je vous suggère de regarder ce lien: http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/
J'ai utilisé IPython pour résoudre le problème associé. Les étapes sont les suivantes:
Étape 1: Installez localement IPython et Jupyter sur la machine distante (A) (sans privilège root) à l'aide des commandes suivantes:
pip install --user ipython
pip install --user jupyter
Mise à jour de matplotlib:
pip install --user -U matplotlib
Étape 2:
Exécutez Jupyter sans navigateur à partir du répertoire de code de la machine distante (A):
cd PATH/TO/THE/CODE
jupyter notebook --no-browser --port=8080
Après cette commande, une adresse URL sera donnée à quelque chose de similaire à ci-dessous:
http: // localhost: 8080 /? token = 5528ab1eeb3f621b90b63420f8bbfc510edf71f21437c4e2
Étape 3:
Ouvrez maintenant un autre terminal de la machine locale (B) et connectez-vous à la machine distante (A) à l’aide de ssh:
ssh -N -L 8080:localhost:8080 [email protected]
Le numéro de port doit être identique à step 2 et step 3. Dans cet exemple, le numéro de port est 8080.
Étape 4:
Copiez et collez l’URL dans le step 3 dans un navigateur de votre ordinateur local (B).
Maintenant, le portable de la machine distante peut être utilisé via le navigateur et le tracé peut être généré à l'aide des données de la machine distante.