我的问题与 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"