Pythonエラーは、Linuxクラスタでスクリプトを実行した場合にのみ発生します。 _tkinter.TclError: No display name and no $DISPLAY 環境変数

Pythonエラーは、Linuxクラスタでスクリプトを実行した場合にのみ発生します。 _tkinter.TclError: No display name and no $DISPLAY 環境変数

私の問題は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

明らかに、これを介してPythonでこれを設定できます

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

おすすめ記事