Environment-Variables

僅當我在 Linux 集群上執行腳本時出現 Python 錯誤:_tkinter.TclError: no display name and no $DISPLAY environment variable

  • February 3, 2021

我的問題與 python 錯誤有關,但我懷疑它更像是 Linux 問題而不是 python 問題。所以我先在這裡貼出來。

我正在執行一個 python 腳本,它進行計算,然後生成一個圖並將其保存在 PDF 文件中。該腳本在我的本地電腦(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 的了解還不夠,無法在集群上完成這項工作。由於它在我的本地機器上執行,我懷疑它必須對集群上的設置做一些事情,尤其是與我使用的設置相關的設置。我知道後者是因為我有同事的腳本也在同一個集群上執行。

有人有想法嗎?

這是使用名為“tk”的庫的 python 程式碼的錯誤。這是一個通常用於顯示 GUI 的庫,因此它希望能夠訪問您的顯示(xserver 或類似的)。

如果您在“無頭”伺服器上執行程式碼,那麼這將不起作用,因為沒有監視器並且您的會話無法與 xserver 對話。

看起來這是 matplot 庫的一個已知問題。見這裡https://github.com/matplotlib/matplotlib/issues/7115/#issuecomment-378288788

顯然它就像在執行 python 腳本之前設置一個環境變數來更改 matplot 後端一樣簡單:

export MPLBACKEND=agg

顯然你可以在 python 中通過

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

引用自:https://unix.stackexchange.com/questions/632344