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