1. ホーム
  2. サーバー
  3. LINUX

TclError: 表示名がなく、$DISPLAY環境変数もない。

2022-01-21 09:27:17
<パス

目次

リアルタイムでデータ前処理+モデル計算を行うサービスは、最近コンテナで展開し、物理マシンのGUIでは問題なく動作していましたが、それに伴う matplotlib 純粋なコマンドラインコンテナに入れたpyplotが(タイトル通り)エラーを報告し、ネットで調べると、原因はpython3-tkやtk-devがインストールされていないからではなく、matplotlibのバックエンドが正しく設定されていないためとのことです。

1. バックエンド

matplotlibは様々な使用例や出力形式を対象としています。matplotlib を python のコマンドラインから対話的に使用し、コマンドを入力するとプロットウィンドウがポップアップするものもあります。matplotlib を wxpython や pygtk などのグラフィカルユーザークロスに埋め込んで、リッチなアプリケーションを構築することもできます。数値シミュレーションからポストスクリプトイメージを生成するバッチスクリプトや、画像を動的に生成するウェブアプリケーションサービスでの matplotlib の利用もあります。

これらのユースケースをすべてサポートするために、matplotlib は、それぞれバックエンドと呼ばれる異なる出力を指向することができます。バックエンドは、グラフィックスを生成するために舞台裏ですべての作業を行います。バックエンドには、インタラクティブとノンインタラクティブの2種類があります。インタラクティブは、pygtk、wxpython、tkinter、qt4、macosxで使用され、ユーザーインターフェースバックエンドとしても知られています。Non-interactiveはPNG, SVG, PDF, PSなどで使われ、ハードコピーバックエンドとしても知られています。

2. バックエンドの4つの設定方法。

(1) matplotlibrcファイルで直接バックエンドを設定し、そのファイルを


場所は変わるかもしれませんので、ご自身で探してみてください 元々tkAggだったのを下のように変更します。

(2) 特定のスクリプトに対して、use()関数を使用することができる。

import matplotlib
matplotlib.use('Agg')

  • 1
  • 2

matplotlib.pyplotをインポートする前にuse()関数を使用しなければならないことに注意してください。

(3) パラメータを指定してスクリプトを実行する。

python3 test.py -dbackend Agg

  • 1

d引数と他の解析用コマンドライン引数の競合に注意してください。

(4) 現在のシェルまたはスクリプトにMPLBACKEND環境変数を設定します。

export MPLBACKEND=Agg
MPLBACKEND=Agg python test.py

  • 1
  • 2

上記の方法は用途に応じて選べますが、コンテナ内で使用する場合は、きっぱりと最初の方法を選ぶべきでしょう

参考

1. _tkinter.TclError: 表示名がない、$DISPLAY環境変数の解決策もない
2. TclError: 表示名がない、$DISPLAY環境変数がない問題が解決されました。