_tkinter.TclError: відсутність відображуваного імені та відсутність змінної середовища $ DISPLAY


197

Я запускаю простий скрипт python на сервері:

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)

Я намагаюся використовувати команду python example.pyна цьому сервері, на якій встановлено matplotlib 1.5.1, вона не вдається з помилкою:

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

Що тут відбувається?


10
Ви працюєте над ssh?
Padraic Cunningham

8
... без -X?
Клаус Д.

1
Якщо ви запускаєте його на ноутбуці Юпітера, запустіть цю команду на ноутбуці%matplotlib inline
GoingMyWay

Якщо ви підключитесь із Win-машини до віддаленого сервера через шпаклівку, вам доведеться встановити Xming, щоб переслати X11.
Serenity

Відповіді:


296

Matplotlib за замовчуванням вибирає бекенд Xwindows. Потрібно встановити matplotlib, щоб він не використовував бекенд Xwindows.

Додайте цей код до початку сценарію ( перед імпортом pyplot ) та повторіть спробу:

import matplotlib
matplotlib.use('Agg')

Або додати до .config/matplotlib/matplotlibrcрядка, backend: Aggщоб використовувати неінтерактивний сервер.

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

Або при підключенні до сервера ssh -X remoteMachineкоманда використання для використання Xwindows.

Також ви можете спробувати експорт дисплей: export DISPLAY=mymachine.com:0.0.

Для отримання додаткової інформації: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server


13
'ssh -X remoteMachine' вирішив мою проблему. Дякую!
користувач3654307

6
що таке "Agg" насправді?
CKM

5
AGG - це абревіатура двигуна "Анти-зерна".
Спокій

5
matplotlib.use('Agg')працює для мене - працює всередині зображення Докера.
Маттіа Патерна

Цей вирішив мою проблему. Я працюю на хмарних віртуальних машинах Google, сподіваюся, це допоможе людям мати таку ж проблему.
Демонстрація

76

Ви можете вирішити це, додавши ці два рядки в ДУЖЕ початок сценарію .py.

import matplotlib
matplotlib.use('Agg')

PS: Помилка все ще буде, якщо ці два рядки не будуть додані на самому початку вихідного коду.


17
Це слід на самому початку коду. Це важливо.
мисливець

це працювало під час роботи matplotlibна докер (не відображається дисплей), але що він робить насправді?
loretoparisi

Це працює для мене, коли я просто запускаю консоль python на своєму vm, але точно той же код виходить з тієї самої помилки на тому ж vm, коли є частиною запущеної програми.
rschwieb

Але зміна бекенда з TkAgg на Agg у файлі config зробила трюк.
rschwieb

42

Щоб додати відповідь, я використав це на початку потрібного сценарію. Таким чином, він працює безперебійно в різних середовищах.

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

Оскільки я не хотів, щоб він завжди використовував 'Agg'бекенд, лише коли він проходитиме, наприклад, через Travis CI.


4
Це рішення має додану цінність як найменш нав'язливу, незалежно від особистої конфігурації. Він повинен бути вище.
jaumebonet

11

У мене була ця сама проблема, намагаючись дистанційно запустити просту програму tkinter на Raspberry Pi. У моєму випадку я хотів відобразити графічний інтерфейс tkinter на пі-дисплеї, але хочу виконати його через SSH з моєї хост-машини. Я також не використовував matplotlib, тому це не було причиною моєї проблеми. Мені вдалося вирішити проблему, встановивши змінну середовища DISPLAY, оскільки помилка підказує командою:

export DISPLAY=:0.0

Хороше пояснення того, що робить змінна середовище відображення та чому синтаксис такий дивний, можна знайти тут: /ubuntu/432255/what-is-display-environment-variable


18
Я намагаюся зберегти сюжети з python та matplotlib.pyplot, що працює над ssh ... це робить мене: _tkinter.TclError: не вдалося підключитися до відображення ": 0.0"
mrk

2

Ще одне рішення - встановити Xvfb та експортувати на нього ваш дисплей. тобто:

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

Тоді

$ експортування DISPLAY =: 8

$ ./example.py


1

Я також зіткнувся з цією проблемою під час використання Xshell для підключення сервера Linux.

Після пошуку методів, я знаходжу Xming + Xshell для вирішення проблеми imshow image з matplotlib.

Якщо розроблені рішення не можуть вирішити вашу проблему, просто спробуйте завантажити Xming за умови, що ви використовуєте Xshell. Потім встановіть атрибут у Xshell, SSH-> tunnel-> X11transfer-> select X DISPLAY localhost: 0.0


1

Щоб побачити зображення, графіки та все, що відображається на Windows на віддаленій машині, вам потрібно підключитися до нього так:

ssh -X user@hostname

Таким чином ви надаєте доступ до X-сервера. Сервер X - це програма в системі X Window, яка працює на локальних машинах (тобто комп’ютерах, якими користуються безпосередньо користувачі) і обробляє весь доступ до графічних карт, екранів дисплеїв та пристроїв введення (як правило, клавіатури та миші) на цих комп’ютерах .

Більше інформації тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.