CentOS7.2のpyenv上python3.5.2環境でtkinterを利用する方法

pandasからグラフを表示させようとしたところ、ちょっと躓いたのでそのメモです。環境は件名のものです。

plot関数を呼び出したところ、'_tkinter'がないよと怒られました。

>>> import pandas as pd
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> df = pd.DataFrame(np.random.randn(500,2), columns=['a', 'b'])
>>> df.cumsum().plot()
(中略)
import _tkinter # If this fails your Python may not be configured for Tk
ImportError: No module named '_tkinter'

tkinterとは、PythonGUIを操作する場合に必要となるライブラリで、その名の通りtkのinterfaceです。スクリプト言語 Tcl とGUIツールキット Tk からなる 「Tcl/Tk 」は、かなり古くからあるGUIスクリプティングツールで、これらはCentOSに最初からインストールされていることが多いです。こいつ使って画像を作ることになるので、Pythonから利用するためのinterfaceが必要ということです。

25.1. tkinter — Tcl/Tk の Python インタフェース — Python 3.5.2 ドキュメント

且つ、pyenv上の既に作成済の環境でtkinterを利用するには、既存のpython環境を再作成する必要がありました。詳しくは、下記のgithubのissueかstackoverflowに書いてあります。

Tkinter import error for pyenv Pythons · Issue #94 · yyuu/pyenv · GitHub

Python not configured for Tk - Stack Overflow

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

$ sudo yum install tk-devel

前述の通り、既に作成していたpyenv上の環境を再作成してあげます。尚、必要であればインストール済みパッケージをバックアップしておきます。

[バックアップ]
$ pyenv local 3.5.2
$ pyenv exec pip freeze > ~/pyp_list.txt
$ pyenv exec pip wheel --wheel-dir=~/wheelhouse -r ~/pyp_list.txt

[再作成]
$ pyenv uninstall 3.5.2
$ pyenv install 3.5.2

tkinterを利用できることを確認します。パッケージをバックアップしている場合、移行してあげます。GNOMEデスクトップ上に空のウィンドウが表示されるはずです。

[移行]
$ pyenv local 3.5.2
$ pyenv exec pip install -r ~/pyp_list.txt --use-wheel --no-index --find-links=~/wheelhouse

[確認]
$ python
>>> import tkinter
>>> root = tkinter.Tk()

f:id:goodbyegangster:20161217053122p:plain

ちなみに、Python2.7.5の環境では"tk-devel"のパッケージではダメで、"tkinter"というパッケージが必要でした。