_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.