Pourquoi est-ce à résoudre le "no $AFFICHAGE de l'environnement" problème avec matplotlib?
Lors de l'exécution d'un code qui utilise la matplotlib
bibliothèque dans mon PC de bureau, je n'ai pas de problèmes à l'aide de la ligne:
import matplotlib.pyplot as plt
loin dans le code, qui est l'endroit où j'utilise en fait le tracé des fonctions.
Si j'exécute le code dans un serveur mais il ne fonctionnera que si je l'importation matplotlib
avant, et les forcer à utiliser la Agg
backend. I. e., J'ai ajouter les lignes suivantes au début du code:
import matplotlib
# Force matplotlib to not use any Xwindows backend.
matplotlib.use('Agg')
(voir cette réponse où c'est expliqué). Sinon, le code va se planter avec TclError: no display name and no $DISPLAY environment variable
(voir cette question par exemple).
La question est: pourquoi ai-je besoin de faire cela? La solution fonctionne parfaitement, mais je ne sais pas pourquoi je n'ai pas à le faire dans mon PC de bureau mais je dois absolument lorsque le code s'exécute sur le serveur.
export DISPLAY=:0
je pense ...Je ne suis pas vraiment à la recherche d'une autre façon de résoudre ce problème, car l'actuel travail fonctionne très bien. Ce que je veux, c'est comprendre pourquoi cela fonctionne. Je ne comprends pas vraiment la solution de rechange dans votre cmmt soit BTW 🙂
DISPLAY
est utilisé par le système X-Windows, UNIX/Linux, il n'est pas de la faute de matplotlib ou Python, juste la façon dont les choses sont sur cette plate-forme. La raison en est la flexibilité, les différents écrans peuvent être sélectionnés en fonction de la variable d'environnement.Êtes-vous sûr que l'AFFICHAGE n'est pas définie par défaut sur votre PC à la maison? C'est souvent dans Linux car l'interface graphique utilise.
A vous de voir si il est installé sur votre système Linux? Utiliser le
set
ou env
commandes. C'est probablement dans l'un des fichiers de démarrage.OriginalL'auteur Gabriel | 2015-03-23
Vous devez vous connecter pour publier un commentaire.
X11 suit un modèle client/serveur où le serveur X accepte les demandes pour des sorties graphiques des applications de client (par exemple, interactif matplotlib sessions), et envoie l'entrée de l'utilisateur à partir du clavier, souris, etc. Pour que ce modèle fonctionne, client des applications ont besoin de savoir quel serveur X pour envoyer leurs demandes. Ceci est contrôlé par le
$DISPLAY
variable d'environnement. Dans le cas où vous vous connectez à une session X distante (par exemple sur une connexion SSH), le$DISPLAY
variable dans la session à distance doit pointer vers votre serveur X local.La
$DISPLAY
variable est structuré comme suit:Pas toutes les parties qui peuvent être présente, le nom d'hôte est généralement omis pour des séances locales, et le numéro de l'écran est également omis s'il n'existe qu'un seul écran. Dans une session terminal server sur un ordinateur portable, mon
$DISPLAY
ressemble à ceci:À condition que le serveur distant prend également en charge X11, il est possible d'ouvrir la fenêtre graphique sur l'ordinateur distant et de les afficher sur votre ordinateur local à l'aide La redirection X11. Pour une connexion SSH, vous faites cela en passant le
-X
(ou-Y
) drapeau.Par exemple:
Le serveur SSH distant doit prendre soin de réglage de la
$DISPLAY
variable de façon appropriée lorsque vous ouvrez la connexion. Dans ce cas particulier,localhost:10.0
est en fait un 'proxy' X11 serveur en cours d'exécution sur la machine distante qui écoute sur l'écran 10 et relais des commandes à votre serveur X local sur la connexion SSH (jetez un oeil à ce si vous êtes intéressé par les détails).Maintenant, vous devriez être en mesure de démarrer une distance IPython session, import matplotlib à l'aide d'un interactive backend, et de créer de la parcelle de windows qui s'affiche sur votre machine locale. Depuis votre clavier/souris d'entrée et de la sortie d'affichage sont en train de passer via une connexion réseau chiffrée, l'intrigue windows sera moins réactif que d'habitude pour une session locale.
Un autre mot d'avertissement: si vous avez une IPython ouvert la session interactive matplotlib de la séance il est impossible de fermer la connexion SSH sans tuer le IPython processus. J'ai aussi parfois appel
matplotlib.use("Agg")
avant que je commence un long processus en cours d'exécution que les importations matplotlib - de cette façon, je peux déconnecter du serveur distant sans tuer le processus.OriginalL'auteur ali_m