Environment-Variables
僅當我在 Linux 集群上執行腳本時出現 Python 錯誤:_tkinter.TclError: no display name and no $DISPLAY environment variable
我的問題與 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"