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

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

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

여기서 무슨 일이 일어나고 있습니까?



답변

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


답변

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

import matplotlib
matplotlib.use('Agg')

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


답변

답을 더하기 위해 필자는 필요한 스크립트의 시작 부분에서 이것을 사용했습니다. 따라서 다양한 환경에서 원활하게 실행됩니다.

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를 통과하는 경우에만 백엔드를 항상 사용하고 싶지 않기 때문에 .


답변

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

export DISPLAY=:0.0

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


답변

또 다른 해결책은 Xvfb를 설치하고 디스플레이를 내보내는 것입니다. 즉 :

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

그때

$ 내보내기 DISPLAY = : 8

$ ./example.py


답변

Xshell을 사용하여 Linux 서버를 연결하는 동안이 문제가 발생했습니다.

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

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


답변

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

ssh -X user@hostname

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

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