복붙노트

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

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)

matplotlib 1.5.1이 설치되어있는이 서버에서 python example.py 명령을 사용하려고하면 오류가 발생합니다.

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

여기서 무슨 일이 일어나고있는거야?

해결법

  1. ==============================

    1.Matplotlib는 기본적으로 Xwindows 백엔드를 선택합니다. Xwindows 백엔드를 사용하지 않도록 matplotlib를 설정해야합니다.

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

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

    import matplotlib
    matplotlib.use('Agg')
    

    또는 .config / matplotlib / matplotlibrc 라인 백엔드에 추가하십시오 : Agg.

    또는 서버에 연결할 때 ssh -X ... 명령을 사용하여 Xwindows를 사용합니다.

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

    그리고이 페이지를 살펴보십시오 : DISPLAY가 정의되지 않은 경우 matplotlib로 PNG 생성하기

  2. ==============================

    2.이 두 줄을 .py 스크립트의 매우 처음 부분에 추가하여 문제를 해결할 수 있습니다.

    이 두 줄을 .py 스크립트의 매우 처음 부분에 추가하여 문제를 해결할 수 있습니다.

    import matplotlib
    matplotlib.use('Agg')
    

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

  3. ==============================

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

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

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

    4.나는 라즈베리 파이에서 원격으로 간단한 tkinter 앱을 실행하려고하는이 똑같은 문제를 가지고 있었다. 제 경우에는 pi 디스플레이에 tkinter GUI를 표시하려고했지만 호스트 시스템에서 SSH를 통해이를 실행할 수 있기를 원합니다. Matplotlib도 사용하지 않았으므로 문제가되지 않았습니다. DISPLAY 환경 변수를 다음과 같은 명령을 통해 오류를 제안 할 때 설정하여이 문제를 해결할 수있었습니다.

    나는 라즈베리 파이에서 원격으로 간단한 tkinter 앱을 실행하려고하는이 똑같은 문제를 가지고 있었다. 제 경우에는 pi 디스플레이에 tkinter GUI를 표시하려고했지만 호스트 시스템에서 SSH를 통해이를 실행할 수 있기를 원합니다. Matplotlib도 사용하지 않았으므로 문제가되지 않았습니다. DISPLAY 환경 변수를 다음과 같은 명령을 통해 오류를 제안 할 때 설정하여이 문제를 해결할 수있었습니다.

    export DISPLAY=:0.0
    

    디스플레이 환경 변수가하는 일과 구문이 왜 이상한 지에 대한 좋은 설명은 다음에서 찾을 수 있습니다. https://askubuntu.com/questions/432255/what-is-display-environment-variable

  5. ==============================

    5.또한 Xshell을 사용하여 Linux 서버에 연결하는 동안이 문제를 만났습니다.

    또한 Xshell을 사용하여 Linux 서버에 연결하는 동안이 문제를 만났습니다.

    메소드를 검색 한 후, Xming + Xshell이 ​​matplotlib로 이미지 imshow 문제를 해결할 수있는 방법을 찾았습니다.

    해결책이 없으면 문제를 해결할 수 없습니다. Xshell을 사용하고있는 상황에서 Xming을 다운로드하십시오. 그런 다음 Xshell에서 속성을 설정하십시오. SSH-> tunnel-> X11transfer-> X DISPLAY localhost : 0.0을 선택하십시오.

  6. ==============================

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

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

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

    그때

    $ export DISPLAY = : 8

    $ ./example.py

  7. from https://stackoverflow.com/questions/37604289/tkinter-tclerror-no-display-name-and-no-display-environment-variable by cc-by-sa and MIT license