2016-06-03 33 views
49

Sto facendo funzionare 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) 

cerco di usare il comando python example.py in questo server che ha matplotlib 1.5.1 installato fallisce 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 

Che cosa sta succedendo qui?

+1

Stai usando questo tramite ssh? –

+0

... senza '-X'? –

+0

Se lo si esegue su notebook Jupyter, esegui questo comando sul taccuino '% matplotlib inline' –

risposta

101

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

aggiungere questo codice all'inizio del vostro script (prima dell'importazione pyplot) e riprovare:

import matplotlib 
matplotlib.use('Agg') 

o aggiungere alla linea di .config/matplotlib/matplotlibrcbackend : Agg.

Oppure quando si connette al server utilizzare il comando ssh -X ... per utilizzare Xwindows.

Inoltre si può tentare di visualizzazione di esportazione: export DISPLAY=mymachine.com:0.0

e guardare attraverso questa pagina: Generating a PNG with matplotlib when DISPLAY is undefined

+3

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

+12

'ssh -X remoteMachine' non ha risolto il mio problema – geneorama

+0

cos'è in effetti 'Agg'? – chandresh

3

Ho avuto questo stesso problema cercando di eseguire una semplice applicazione Tkinter in remoto su un Raspberry Pi. Nel mio caso volevo visualizzare la GUI di tkinter sul display pi, ma voglio essere in grado di eseguirlo su SSH dal mio computer host. Inoltre non stavo usando Matplotlib, quindi non era la causa del mio problema. Sono stato in grado di risolvere il problema impostando la variabile d'ambiente DISPLAY come l'errore suggerisce con il comando:

export DISPLAY=:0.0 

Una buona spiegazione di ciò che la variabile d'ambiente di visualizzazione sta facendo e perché la sintassi è così strano può essere trovato qui : https://askubuntu.com/questions/432255/what-is-display-environment-variable

+8

Sto cercando di salvare i grafici con python e matplotlib.pyplot su ssh ... questo mi fa ottenere: _tkinter.TclError: impossibile connettersi per visualizzare ": 0.0" – vanilla

26

È possibile risolverlo aggiungendo queste due righe nell'MOLTO all'inizio dello script .py.

import matplotlib 
matplotlib.use('Agg') 

PS: L'errore esiste ancora se queste due righe non vengono aggiunte all'inizio del codice sorgente.

+5

Dovrebbe essere proprio all'inizio del codice. Questo è importante. – hunter

+0

ha funzionato durante l'esecuzione di 'matplotlib' sulla finestra mobile (nessun display collegato), ma cosa fa in realtà? – loretoparisi

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 immagine con matplotlib.

Se le soluzioni aboved non possono risolvere il tuo problema, prova a scaricare Xming nella condizione in cui stai usando Xshell. Quindi impostare l'attributo di Xshell, SSH-> tunnel-> X11transfer-> scegliere X DISPLAY localhost: 0.0

0

Un'altra soluzione è quella di installare Xvfb, ed esportare il display ad esso. cioè:

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

Poi

$ export DISPLAY =: 8

$ ./example.py