前書き
この投稿が二つ目の記事投稿になるN高生です。
この記事はpyenvからインストールしたpythonでimport tkinterができなかったのでそれをできるようにする対処法を書きます。
ほぼ備忘録ですが。。。
例によって、いろんなサイトを参考にしたのでそこのところご了承いただけると幸いです。
なお、この記事が最適解ではないと思うので、色々なサイトを調べることをお勧めします。
動作環境
macOS Mojave(10.14.6)
python 3.7.0
pip 20.2.3
Homebrew 2.5.2
#ことの発端
pyenvからインストールしたpythonでimport tkinterをするとimport errorが出た。
(記事を投稿すると思っていなかったのでコードをメモしていない...)
調べてみると
macOS(Mojave)でNo module named ‘_tkinter’を解決する(pyenv , Python3.x)
という今回の症状と酷似した内容の記事が見つかったためひとまずこちらを参考に進めてみた。
解決に向けて試行錯誤
まずpyenvでインストールしたpythonをアンインストールしないといけないらしいので
#pipでインストールしたものをバックアップ
$ pip freeze > pip.txt
#アンインストール
$ pyenv uninstall 3.7.0
#もしHomebrewからtcl-tkをインストールしている場合は削除
$ brew uninstall tcl-tk
ここまで準備ができたら次は
ActiveTclというサイトから8.5系をインストールしましょう。
これがインストールできたらもう一度pyenvからpythonをインストールします。
私は3.7.0をインストールしました。この際、ここのコードに書いてある文を一文づつコピーしてターミナルに入れてください。
(筆者は最初インストールコマンドしか入れてなくて、あとあと苦労してます)
$ CFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include" \
$ LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix openssl)/lib" \
$ PYTHON_CONFIGURE_OPTS=--enable-unicode=ucs2 \
$ pyenv install 3.7.0
$ pyenv global 3.7.0
ここで人によっては.bash_profileをいじる可能性があります。
(私はいじらなくても大丈夫でした)
ひとまず解決...?
エラー出てない!!!
これで開発に取りかかれる!と思って次の一文を打つとあれ...
今度はRuntime errorが出てきました...なんてこった...
#解決に向けて試行錯誤(2回目)
ということで今度はこのエラーを解決するために色々調べてみた。
このgithubがどのサイトをみても参考にされていたので一度、目を通してみたが筆者は初心者なので正直あまりよくわからなかった。(わかる人ならこれで解決できると思います)
そこで別のサイトを探し、
macOS Catalina 10.15.1のpyenv環境でtkinterを利用するための設定(python 3.7.x系)という日本語で書かれたサイトが出てきたのでこちらを参考に進めた。
#pipのバックアップを忘れずに行う
$ pyenv uninstall 3.7.0
#brewからtcl-tkをインストール
$ brew install tcl-tk
次にpython-buildを書き換えます。しかしこのファイルはFinderで開いても見つからないので次のコマンドをターミナルに入れます。
open /usr/local
こうすることで、自動的にFinderが開き、ファイルが表示されます。私かここからpython-buildを探しました。
python-buildの場所
(私の環境の場合)
/Cellar/pyenv/plugins/python-build/bin/python-guild
にあり、その770行目あたりに
$CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1
と記載されている欄を
$CONFIGURE_OPTS --with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6' ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1
と置き換える。
これのあと、改めてpythonをインストールする。
$ pyenv install 3.7.0
さて、REPLで再度試してみよう。
今度こそ治った!
今回はエラーも出ず、ファイルを実行した際もエラーが出ませんでした。これにて一件落着。
今回もなかなか大変だった。
また記事を書く機会があれば書きます。