turtlechanのブログ

無知の私がLinuxをいじりながら書いていくブログ

Pythonで _tkinter がないと言われる件

pyenv でインストールしたPythontkinter をインポートして実行すると _tkinterないよ的なエラーが出た。他にも最近 Manjaro Linux KDE をインストールしていじっているが、そちらのPythonでも同様だった。

tkinter は matplotlib で使われているので結構大事ですよね。

解決策が分かったので残しておきます。

tkinter があるか確認

一行のコマンドで確認できる。コマンドとエラーを以下に。

python2の場合
~$ python2 -m Tkinter
Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 39, in 
    import _tkinter # If this fails your Python may not be configured for Tk
ImportError: libtk8.6.so: cannot open shared object file: No such file or directory
python3の場合
~$ python3 -m tkinter
Traceback (most recent call last):
  File "/usr/lib/python3.7/runpy.py", line 183, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "/usr/lib/python3.7/runpy.py", line 142, in _get_module_details
    return _get_module_details(pkg_main_name, error)
  File "/usr/lib/python3.7/runpy.py", line 109, in _get_module_details
    __import__(pkg_name)
  File "/usr/lib/python3.7/tkinter/__init__.py", line 36, in 
    import _tkinter # If this fails your Python may not be configured for Tk
ImportError: libtk8.6.so: cannot open shared object file: No such file or directory

上記のようなコメントが出たら _tkinter がない。

以下のようなウィンドウが表示されれば _tkinter ある。

tkinterのウィンドウ

tkinter がなかった場合

ここからは tkinter がなかった場合にする作業です。

TK をインストールする

使っているディストーションに合わせて実行してください。

Debian
~$ sudo apt-get install tk-dev
RedHat
~$ sudo yum install tk-devel
Arch系
~$ sudo pacman -S tk

パッケージ名が若干違う。

pyenv 経由のPythonでなければ、この時点で使えるようになっているはず。

Pythonの再インストール

pyenv でPythonをインストールしている場合はPythonを再インストールする必要があった。
Manjaro Linux に元から入っているPythonの場合は必要なかったのでコンパイルの関係だろうか。

pip で色々とライブラリをインストールしていると、あとから戻すのが大変なので書き出しておきます。

~$ pip freeze > piplist2.txt
~$ pip3 freeze > piplist3.txt

pyenv の Python アンインストール

~$ pyenv uninstall <pythonのバージョン>

pyenv の Python インストール

~$ pyenv install <pythonのバージョン>

pyenv に Python を指定しておく。

~$ pyenv global <python2のバージョン> <python3のバージョン>

先程書き出したもの(piplist.txt)を読み込んで、ライブラリをインストールします。

~$ pip install --requirement ./piplist2.txt
~$ pip3 install --requirement ./piplist3.txt

最後に確認

多分問題なくTKのウィンドウが表示されるはずです。が、確認。

python2の場合
~$ python2 -m Tkinter
python3の場合
~$ python3 -m tkinter

ウィンドウが表示されればオッケーです。

おわりに

Linux の系統によってパッケージ名が若干違って混乱するので、整理するために書きました。
何かの参考になれば幸いです。