matplotlib 使おうとしたら No module named ‘_tkinter’ エラーで怒られた

matplotlib 使おうとしたら No module named ‘_tkinter’ エラーで怒られた.
tkinter モジュールがない, とのことらしい.

解決までの過程をメモ.

概要は次の通り.

動作環境

  • CentOS 7
  • Python 3.6.5

vagrant上にcentosを入れて, ホストマシンであるwindows10から操作する.

背景

次のコマンドを実行したら tkinter がないよ, と怒られた.

どうやら from matplotlib import pyplot でコケたらしい.
matplotlibが tkinter に依存してるっぽい.

原因調査をしてみる.

tkinter ってなに

まず tkinter について.

Tkinter は Python からGUIを構築・操作するための標準ライブラリ(ウィジェット・ツールキット)である。

(中略)

これにより、スクリプト言語である Python から簡単にGUI画面をもったアプリケーションを作ることが可能になる。

引用: Tkinter | wikipedia

pythonのplotとかをよしなに描画してくれるツールっぽい.

公式サイトも見てみる.

The tkinter package (“Tk interface”) is the standard Python interface to the Tk GUI toolkit.
Both Tk and tkinter are available on most Unix platforms, as well as on Windows systems. (Tk itself is not part of Python; it is maintained at ActiveState.)
You can check that tkinter is properly installed on your system by running
python -m tkinter
from the command line; this should open a window demonstrating a simple Tk interface.

引用: tkinter — Python interface to Tcl/Tk

GUIの描画ツールだよー, と書かれている.
次のコマンドで tkinter がinstallされているかチェックできるらしいので, 実行してみる.

予想通り, 自分の環境に tkinter はないね.

tkinter インストール

ググったり, pip でパッケージ探したりしたけど…
どうやら yum コマンドで入手するのがベターっぽい.

この辺りについては次のサイト主さんが丁寧にまとめてくれていた.
ありがとうございます.

今回の環境では”tk-devel”というパッケージがインストールするそれにあたりました。
“tkinter”というパッケージだと動きません。罠です。

引用: CentOS7.2のpyenv上python3.5.2環境でtkinterを利用する方法 |goodbyegangsterのブログ

パッケージ確認 & インストール を行う.

installしただけでは tkinter は使えない.
先程紹介したサイト主さんが仰るように, pythonの uninstall / install を行う必要がある.

私は anyenv 経由で pyenvを入れて python を入れたので,
なにか起きたらこの辺を疑ってみる.

ちゃんと動くか確認.

コケた.
手強いな…

ざっとエラーログを見ると環境変数が与えられてないっぽい.

いろいろ調べてみると, どうやら matplotlib はssh経由で起動しようとしたらこのエラーときに遭遇しやすいらしい.

ドキュメントの該当箇所はここ↓

Matplotlib in a web application server

Many users report initial problems trying to use maptlotlib in web application servers,
because by default Matplotlib ships configured to work with a graphical user interface which may require an X11 connection.
Since many barebones application servers do not have X11 enabled, you may get errors if you don’t configure Matplotlib for use in these environments.
Most importantly, you need to decide what kinds of images you want to generate (PNG, PDF, SVG) and configure the appropriate default backend.
For 99% of users, this will be the Agg backend, which uses the C++ antigrain rendering engine to make nice PNGs.
The Agg backend is also configured to recognize requests to generate other output formats (PDF, PS, EPS, SVG).
The easiest way to configure Matplotlib to use Agg is to call:

引用: Matplotlib in a web application server | matplotlib.org

今回私がコケたのは↑これの太字箇所.

この辺は好みの問題だと思うけど, 私はサーバ上でもpythonを走らせるかもしれないのでデフォルト設定自体を変える.

ドキュメントによると Agg を設定すればいいらしい.
Agg backend については引用元を参照.

毎回 import 時に設定するのは面倒なので, 設定ファイル自体を書き換える.

anyenvを使っている関係で設定ファイルの場所がわかりにくい.
たぶん大元の設定ファイルはこれ↓

  • /home/vagrant/.anyenv/envs/pyenv/versions/3.6.5/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc

ファイル設定を変更.

設定完了.

動作確認として図をpngとして出力してみる.

実行

$ python app.py

出力された sinWave.png を確認

ok.

今回は以上.

スポンサーリンク
336 x 280 – レクタングル(大)
336 x 280 – レクタングル(大)
  • このエントリーをはてなブックマークに追加

この記事が気に入ったら
いいね!しよう

スポンサーリンク
336 x 280 – レクタングル(大)
トップへ戻る