Python 오류는 Linux 클러스터에서 스크립트를 실행할 때만 발생합니다. _tkinter.TclError: No display name and no $DISPLAY 환경 변수

Python 오류는 Linux 클러스터에서 스크립트를 실행할 때만 발생합니다. _tkinter.TclError: No display name and no $DISPLAY 환경 변수

내 문제는 Python 오류와 관련이 있지만 이것이 Python 문제라기보다는 Linux 문제에 더 가깝다고 생각됩니다. 그래서 여기에 먼저 올렸습니다.

계산을 수행한 다음 플롯을 생성하고 PDF 파일에 저장하는 Python 스크립트를 실행 중입니다. 스크립트는 로컬 컴퓨터(Mac OS)에서 실행되지만 직장(Linux)의 클러스터에서 실행하면 PDF에서 플롯을 생성하려고 할 때 다음 오류와 함께 충돌합니다.

Traceback (most recent call last):

 File "<my_python_script>.py", line 496, in <module>
    if __name__ == "__main__": main()

 File "<my_python_script>.py", line 487, in main
    plot(model, obsdata, popt, pdf_file)

 File "<my_python_script>.py", line 455, in plot
    plt.figure(figsize=(11.69, 8.27))

 File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 535, in figure
    **kwargs)

 File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 81, in new_figure_manager
    return new_figure_manager_given_figure(num, figure)

 File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 89, in new_figure_manager_given_figure
    window = Tk.Tk()

 File "/usr/lib/python3.5/tkinter/__init__.py", line 1880, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)

_tkinter.TclError: no display name and no $DISPLAY environment variable

여기서는 <my_python_script>중요하지 않은 스크립트 경로와 이름을 약어로 대체했습니다.

질문과 관련이 있을 수도 있고 없을 수도 있지만 스크립트가 명령줄에서 수동으로 실행되지 않고 대기열에 제출된다는 점도 언급해야 합니다 slurm.

불행하게도 저는 클러스터에서 이 작업을 수행하기에는 Unix/Linux에 대해 충분히 알지 못합니다. 내 로컬 컴퓨터에서 실행되고 있기 때문에 클러스터의 설정, 특히 내가 사용 중인 설정과 관련하여 뭔가 작업을 수행하고 있는 것 같습니다. 내 동료의 스크립트도 동일한 클러스터에서 실행되고 있기 때문에 후자를 알고 있습니다.

누구든지 어떤 아이디어가 있습니까?

답변1

이것은 "tk"라는 라이브러리를 사용하는 Python 코드의 버그입니다. 이는 일반적으로 GUI를 표시하는 데 사용되는 라이브러리이므로 모니터(xserver 또는 유사한)에 액세스할 수 있을 것으로 예상됩니다.

"헤드리스" 서버에서 코드를 실행하는 경우 모니터가 없고 세션이 xserver와 통신할 수 없기 때문에 작동하지 않습니다.

이는 matplot 라이브러리의 알려진 문제인 것 같습니다. 이봐https://github.com/matplotlib/matplotlib/issues/7115/#issuecomment-378288788

분명히 이것은 Python 스크립트를 실행하기 전에 matplot 백엔드를 변경하기 위해 환경 변수를 설정하는 것만 큼 간단합니다.

export MPLBACKEND=agg

분명히 당신은 이것을 통해 파이썬으로 이것을 설정할 수 있습니다

os.environ["MPLBACKEND"] = "agg"

관련 정보