_tkinter.TclError: nessun nome visualizzato e nessuna variabile d'ambiente $ DISPLAY


197

Sto eseguendo un semplice script Python nel server:

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)

Provo ad usare il comando python example.py in questo server su cui è installato matplotlib 1.5.1 che non riesce con l'errore:

Traceback (most recent call last):
  File "example.py", line 7, in <module>
    plt.scatter(x, y, s=20)
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 3241, in scatter
    ax = gca()
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 928, in gca
    return gcf().gca(**kwargs)
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 578, in gcf
    return figure()
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 527, in figure
**kwargs)
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.py", line 84, in new_figure_manager
    return new_figure_manager_given_figure(num, figure)
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.py", line 92, in new_figure_manager_given_figure
    window = Tk.Tk()
  File "/usr/local/lib/python2.7/lib-tk/Tkinter.py", line 1810, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

Cosa sta succedendo qui?


10
Stai eseguendo questo su SSH?
Padraic Cunningham,

8
... senza -X?
Klaus D.

1
Se lo esegui sul notebook Jupyter, esegui questo comando sul notebook%matplotlib inline
GoingMyWay,

Se ti connetti dalla macchina Win al server remoto tramite putty devi installare Xming per inoltrare X11.
Serenità,

Risposte:


297

Matplotlib sceglie il backend di Xwindows per impostazione predefinita. È necessario impostare matplotlib per non utilizzare il backend di Xwindows.

Aggiungi questo codice all'inizio dello script ( prima di importare pyplot ) e riprova:

import matplotlib
matplotlib.use('Agg')

Oppure aggiungi alla .config/matplotlib/matplotlibrcriga backend: Aggper utilizzare il back-end non interattivo.

echo "backend: Agg" > ~/.config/matplotlib/matplotlibrc

O quando ci si collega all'utilizzo del server ssh -X remoteMachine comando per utilizzare Xwindows.

Inoltre puoi provare ad esportare display: export DISPLAY=mymachine.com:0.0 .

Per maggiori informazioni: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server


13
'ssh -X remoteMachine' ha risolto il mio problema. Grazie!
user3654307

6
che cos'è infatti Agg?
CKM

5
AGG è l'abbreviazione di motore di geometria Anti-grano.
Serenità

5
matplotlib.use('Agg')funziona per me - correre all'interno di un'immagine Docker.
Mattia Paterna

Questo ha risolto il mio problema. Sono in esecuzione su VM cloud di Google, spero che questo aiuti le persone ad avere lo stesso problema.
Demo

76

Puoi risolverlo aggiungendo queste due righe all'inizio MOLTO del tuo script .py.

import matplotlib
matplotlib.use('Agg')

PS: l'errore continuerà a esistere se queste due righe non vengono aggiunte all'inizio del codice sorgente.


17
Dovrebbe essere all'inizio del codice. Questo è importante.
cacciatore,

questo ha funzionato quando si esegue matplotlibsulla finestra mobile (nessuno schermo collegato), ma che cosa fa effettivamente?
Loretoparisi,

Questo funziona per me quando eseguo semplicemente la console Python sul mio VM, ma lo stesso codice esatto non riesce con lo stesso errore esatto sulla stessa VM quando parte dell'applicazione in esecuzione.
rschwieb,

Ma cambiare il backend da TkAgg a Agg nel file di configurazione ha funzionato.
rschwieb,

42

Per aggiungere la risposta, l'ho usato all'inizio dello script necessario. Quindi funziona senza problemi su diversi ambienti.

import os
import matplotlib as mpl
if os.environ.get('DISPLAY','') == '':
    print('no display found. Using non-interactive Agg backend')
    mpl.use('Agg')
import matplotlib.pyplot as plt

Perché non volevo che fosse sempre usando il 'Agg'backend, solo quando passava attraverso Travis CI per esempio.


4
Questa soluzione ha il valore aggiunto di essere la meno invadente con qualunque configurazione personale si abbia. Dovrebbe essere più alto.
Jaumebonet,

11

Ho avuto lo stesso problema provando a eseguire una semplice app tkinter in remoto su un Raspberry Pi. Nel mio caso, volevo visualizzare la GUI di tkinter sul display pi, ma volevo essere in grado di eseguirla su SSH dal mio computer host. Inoltre non stavo usando matplotlib, quindi questa non era la causa del mio problema. Sono stato in grado di risolvere il problema impostando la variabile di ambiente DISPLAY come l'errore suggerisce con il comando:

export DISPLAY=:0.0

Una buona spiegazione di cosa sta facendo la variabile di ambiente di visualizzazione e perché la sintassi è così strana può essere trovata qui: /ubuntu/432255/what-is-display-environment-variable


18
Sto cercando di salvare grafici con Python e Matplotlib.pyplot in esecuzione su SSH ... In questo modo mi viene: _tkinter.TclError: impossibile connettermi per visualizzare ": 0.0"
mrk

2

Un'altra soluzione è installare Xvfb ed esportare il display su di esso. vale a dire:

disp=:8
screen=0
geom=640x480x24
exec Xvfb $disp -screen $screen $geom 2>/tmp/Xvfb.log &

Poi

$ export DISPLAY =: 8

$ ./esempio.py


1

Ho anche riscontrato questo problema durante l'utilizzo di Xshell per connettere il server Linux.

Dopo aver cercato i metodi, trovo Xming + Xshell per risolvere il problema di visualizzazione dell'immagine con matplotlib.

Se le soluzioni adottate non sono in grado di risolvere il tuo problema, prova a scaricare Xming a condizione che stai utilizzando Xshell. Quindi imposta l'attributo in Xshell, SSH-> tunnel-> X11transfer-> scegli X DISPLAY localhost: 0.0


1

Per vedere immagini, grafici e qualsiasi cosa visualizzata su Windows sul tuo computer remoto devi connetterti ad esso in questo modo:

ssh -X user@hostname

In questo modo abiliti l'accesso al server X. Il server X è un programma nel sistema X Window che funziona su macchine locali (ovvero i computer utilizzati direttamente dagli utenti) e gestisce tutti gli accessi a schede grafiche, schermi di visualizzazione e dispositivi di input (in genere una tastiera e un mouse) su quei computer .

Maggiori informazioni qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.