_tkinter.TclError : 표시 이름 없음 및 $ DISPLAY 환경 변수 없음


197

서버에서 간단한 파이썬 스크립트를 실행 중입니다.

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.pymatplotlib 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 2016 년

8
...없이 -X?
클라우스 D.

1
Jupyter 노트북에서 실행하는 경우 노트북에서이 명령을 실행하십시오.%matplotlib inline
GoingMyWay

퍼티를 통해 Win 시스템에서 원격 서버로 연결하는 경우 Xming을 설치하여 X11을 전달해야합니다.
평온

답변:


296

Matplotlib은 기본적으로 Xwindows 백엔드를 선택합니다. Xwindows 백엔드를 사용하지 않으려면 matplotlib를 설정해야합니다.

이 코드를 스크립트 시작 부분에 추가하고 ( pyplot을 가져 오기 전에 ) 다시 시도하십시오.

import matplotlib
matplotlib.use('Agg')

또는 비 대화식 백엔드를 사용 하려면 .config/matplotlib/matplotlibrc회선 backend: Agg에 추가하십시오 .

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

또는 서버에 연결할 때 ssh -X remoteMachineXwindows를 사용 하는 명령을 사용하십시오.

또한 디스플레이를 내보내려고 할 수도 있습니다 export DISPLAY=mymachine.com:0.0..

자세한 내용은 https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server


13
'ssh -X remoteMachine'이 내 문제를 해결했습니다. 감사합니다!
user3654307 2016 년

6
실제로 'Agg'란 무엇입니까?
CKM

5
AGG는 안티 그레인 지오메트리 엔진의 약어입니다.
평온

5
matplotlib.use('Agg')Docker 이미지 내부에서 실행됩니다.
Mattia Paterna

이것은 내 문제를 해결했습니다. Google 클라우드 VM에서 실행 중이므로 사람들이 동일한 문제를 해결할 수 있기를 바랍니다.
데모

76

당신은이 두 줄을 추가하여 해결할 수있는 아주 당신의 평 스크립트의 시작.

import matplotlib
matplotlib.use('Agg')

추신 : 소스 코드의 맨 처음 에이 두 줄을 추가하지 않으면 오류가 계속 발생합니다.


17
코드의 시작 부분에 있어야합니다. 이건 중요하다.
헌터

이것은 matplotlibdocker (디스플레이가 부착되지 않은)에서 실행될 때 효과적이지만 실제로는 무엇을합니까?
loretoparisi

이것은 내 VM에서 파이썬 콘솔을 실행할 때 효과적이지만 실행중인 응용 프로그램의 일부 일 때 동일한 VM에서 동일한 오류가 발생하면서 동일한 코드가 실패합니다.
rschwieb

그러나 구성 파일에서 백엔드를 TkAgg에서 Agg로 변경하면 트릭이되었습니다.
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

Raspberry Pi에서 간단한 tkinter 앱을 원격으로 실행하려고하는 것과 동일한 문제가 발생했습니다. 필자의 경우 pi 디스플레이에 tkinter GUI를 표시하고 싶지만 호스트 컴퓨터의 SSH를 통해 실행할 수 있기를 원합니다. 또한 matplotlib을 사용하지 않았으므로 문제의 원인이 아닙니다. 명령에서 오류가 제안하는대로 DISPLAY 환경 변수를 설정하여 문제를 해결할 수있었습니다.

export DISPLAY=:0.0

디스플레이 환경 변수가 수행하는 작업과 구문이 왜 이상한지에 대한 자세한 설명은 /ubuntu/432255/what-is-display-environment-variable 에서 찾을 수 있습니다.


18
나는이 일을 ... SSH를 통해 실행 파이썬과 matplotlib.pyplot와 플롯을 저장하는 시도하고 저를 가져옵니다 _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 서버를 연결하는 동안이 문제가 발생했습니다.

메소드를 검색 한 후 matplotlib의 이미지 imshow 문제를 해결하기 위해 Xming + Xshell을 찾습니다.

위의 해결 방법으로 문제를 해결할 수 없다면 Xshell을 사용하는 조건에서 Xming을 다운로드하십시오. 그런 다음 Xshell, SSH-> 터널-> X11transfer-> X 디스플레이 로컬 호스트 선택 : 에서 속성을 설정하십시오 .


1

이미지, 플롯 및 원격 시스템의 창에 표시된 것을 보려면 다음과 같이 연결해야합니다.

ssh -X user@hostname

그렇게하면 X 서버에 액세스 할 수 있습니다. X 서버는 로컬 컴퓨터 (예 : 사용자가 직접 사용하는 컴퓨터)에서 실행되는 X Window 시스템의 프로그램으로 해당 컴퓨터의 그래픽 카드, 디스플레이 화면 및 입력 장치 (일반적으로 키보드 및 마우스)에 대한 모든 액세스를 처리합니다. .

자세한 내용은 여기를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.