내 문제는 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"