_tkinter.TclError: sin nombre para mostrar y sin variable de entorno $ DISPLAY

194

Estoy ejecutando un script simple de Python en el servidor:

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)

Intento usar el comando python example.pyen este servidor que tiene instalado matplotlib 1.5.1, falla con el error:

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

¿Que está sucediendo aquí?

usuario3654307
fuente
10
¿Estás ejecutando esto sobre ssh?
Padraic Cunningham
8
... sin -X?
Klaus D.
1
Si lo ejecuta en el cuaderno Jupyter, ejecute este comando en el cuaderno%matplotlib inline
GoingMyWay
Si se conecta desde la máquina Win al servidor remoto a través de masilla, debe instalar Xming para reenviar X11.
Serenity

Respuestas:

293

Matplotlib elige el backend de Xwindows por defecto. Debe configurar matplotlib para que no use el backend de Xwindows.

Agregue este código al comienzo de su script ( antes de importar pyplot ) e intente nuevamente:

import matplotlib
matplotlib.use('Agg')

O agregue a la .config/matplotlib/matplotlibrclínea backend: Aggpara usar el backend no interactivo.

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

O cuando se conecta al servidor, use el ssh -X remoteMachinecomando para usar Xwindows.

También puede tratar de pantalla de exportación: export DISPLAY=mymachine.com:0.0.

Para más información: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server

Serenidad
fuente
13
'ssh -X remoteMachine' resolvió mi problema. ¡Gracias!
user3654307
66
¿Qué es 'Agg' de hecho?
CKM
55
AGG es la abreviatura del motor de geometría antigrano.
Serenity
55
matplotlib.use('Agg')funciona para mí, ejecutándose dentro de una imagen de Docker.
Mattia Paterna
Este resolvió mi problema. Estoy ejecutando máquinas virtuales en la nube de Google, espero que esto ayude a las personas a tener el mismo problema.
Demo
76

Puede resolverlo agregando estas dos líneas al COMIENZO de su script .py.

import matplotlib
matplotlib.use('Agg')

PD: El error seguirá existiendo si estas dos líneas no se agregan al comienzo del código fuente.

Qihui
fuente
17
Debería estar al principio del código. Esto es importante.
cazador
esto funcionó cuando se ejecuta matplotliben la ventana acoplable (sin pantalla adjunta), pero ¿qué hace realmente?
loretoparisi
Esto funciona para mí cuando solo ejecuto la consola de Python en mi máquina virtual, pero el mismo código falla exactamente con el mismo error en la misma máquina virtual cuando forma parte de la aplicación en ejecución.
rschwieb
Pero cambiar el backend de TkAgg a Agg en el archivo de configuración hizo el truco.
rschwieb
42

Para agregar la respuesta, usé esto al comienzo del script necesario. Por lo tanto, funciona sin problemas en diferentes entornos.

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

Porque no quería que siempre usara el 'Agg'backend, solo cuando pasaría por Travis CI, por ejemplo.

Sylhare
fuente
44
Esta solución tiene el valor agregado de ser la menos intrusiva con cualquier configuración personal que tenga. Debería ser más alto.
jaumebonet
11

Tuve este mismo problema al intentar ejecutar una aplicación tkinter simple de forma remota en una Raspberry Pi. En mi caso, quería mostrar la GUI de tkinter en la pantalla pi, pero quiero poder ejecutarla a través de SSH desde mi máquina host. Tampoco estaba usando matplotlib, así que esa no fue la causa de mi problema. Pude resolver el problema estableciendo la variable de entorno DISPLAY como sugiere el error con el comando:

export DISPLAY=:0.0

Una buena explicación de lo que está haciendo la variable de entorno de visualización y por qué la sintaxis es tan extraña se puede encontrar aquí: /ubuntu/432255/what-is-display-environment-variable

ajgriese
fuente
18
Estoy tratando de guardar tramas con python y matplotlib.pyplot ejecutándose sobre ssh ... esto me da: _tkinter.TclError: no se pudo conectar para mostrar ": 0.0"
mrk
2

Otra solución es instalar Xvfb y exportarle su pantalla. es decir:

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

Luego

$ export DISPLAY =: 8

$ ./example.py

Joseph
fuente
1

También encontré este problema mientras usaba Xshell para conectar el servidor Linux.

Después de buscar métodos, encuentro Xming + Xshell para resolver el problema de imagen imshow con matplotlib.

Si las soluciones anteriores no pueden resolver su problema, solo intente descargar Xming bajo la condición de que esté usando Xshell. Luego configure el atributo en Xshell, SSH-> tunnel-> X11transfer-> elija X DISPLAY localhost: 0.0

Modo
fuente
1

Para ver imágenes, diagramas y cualquier cosa que se muestre en las ventanas de su máquina remota, debe conectarse de esta manera:

ssh -X user@hostname

De esa manera habilita el acceso al servidor X. El servidor X es un programa en el sistema X Window que se ejecuta en máquinas locales (es decir, las computadoras utilizadas directamente por los usuarios) y maneja todo el acceso a las tarjetas gráficas, pantallas de visualización y dispositivos de entrada (generalmente un teclado y mouse) en esas computadoras .

Más información aquí .

tsveti_iko
fuente