仅当我在 Linux 集群上运行脚本时出现 Python 错误:_tkinter.TclError:没有显示名称且没有 $DISPLAY 环境变量

仅当我在 Linux 集群上运行脚本时出现 Python 错误:_tkinter.TclError:没有显示名称且没有 $DISPLAY 环境变量

我的问题与 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 的了解实在不够,无法在集群上进行这项工作。由于它在我的本地计算机上运行,​​我怀疑它必须对集群上的设置进行某些操作,特别是与我使用的相关设置。我知道后者是因为我的同事的脚本也在同一个集群上运行。

有人有想法吗?

答案1

这是使用名为“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"

相关内容