26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pyenv が homebrew でインストールした tcl-tk と動かない。

Posted at

遭遇した問題

Macでpyenvを使ってインストールしたpythonから、tkinter を使おうとしたところ、次のエラーがでた。

Traceback (most recent call last):
  File "./annotate.py", line 3, in <module>
    import tkinter
  File "/Users/???/.pyenv/versions/3.7.4/lib/python3.7/tkinter/__init__.py", line 36, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'

環境は、

  • MacOS Catalina 10.15.1
  • pyenv 1.2.15

ググって見つかった(そして解決しなかった)方法

pyenv で python を再インストールする

pyenv でpythonをインストールしている場合、一旦 uninstall して install し直すと解決するらしい。

ググって見つけたのは以下のページ:

具体的には、↓な感じ。

$ pyenv versions
 system
* 3.7.5                 # 現在使われている python が 3.7.5 だったので
$ pyenv uninstall 3.7.5 # python 3.7.5 をアンインストールして
$ brew install tcl-tk   # homebrew で tcl-tk をインストールして
$ export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"      # tcl-tk の開発に必要な
$ export CPPFLAGS="-I/usr/local/opt/tcl-tk/include" # 徹底を行ってから
$ pyenv install 3.7.5   # 改めて python 3.7.5 をインストールする

しかし、再度 tkinter を実行してみると・・・

$ python -m tkinter
DEPRECATION WARNING: The system version of Tk is deprecated and may be removed 
in a future release. Please don't rely on it. Set TK_SILENCE_DEPRECATION=1 to suppress this warning.
Traceback (most recent call last):
  File "/Users/???/.pyenv/versions/3.7.4/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/Users/???/.pyenv/versions/3.7.4/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File 
"/Users/???/.pyenv/versions/3.7.4/lib/python3.7/tkinter/__main__.py", line 7, in <module>
main()
  File "/Users/???/.pyenv/versions/3.7.4/lib/python3.7/tkinter/__init__.py", line 3988, in _test
    root = Tk()
  File "/Users/???/.pyenv/versions/3.7.4/lib/python3.7/tkinter/__init__.py", line 2025, in __init__
    self._loadtk()
  File "/Users/???/.pyenv/versions/3.7.4/lib/python3.7/tkinter/__init__.py", line 2040, in _loadtk
    % (_tkinter.TK_VERSION, tk_version))
RuntimeError: tk.h version (8.6) doesn't match libtk.a version (8.5)

と別のエラーが出てしまう。
この場合、header は version 8.6 を使ってコンパイルされるが、実行時に参照されるライブラリが version 8.5 担っているということらしい。

さらにググるも、日本語の解は見つからず。

解決策

英語でググったところ、次のページが見つかった。

これですね。

つまり、/usr/local/Cellar/pyenv/VERSION/plugins/python-build/bin/python-build を編集して、次のパッチを当てる(と言っても、銭湯が "!" となっている1行書き換える)。

diff -c python-build.orig python-build
*** python-build.orig	2019-12-10 17:47:04.000000000 +0900
--- python-build.new	2019-12-11 11:53:17.000000000 +0900
***************
*** 772,778 ****
        export CC=clang
      fi
      ${!PACKAGE_CONFIGURE:-./configure} --prefix="${!PACKAGE_PREFIX_PATH:-$PREFIX_PATH}" \
!       $CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1
    ) >&4 2>&1
  
    { "$MAKE" $MAKE_OPTS ${!PACKAGE_MAKE_OPTS} "${!PACKAGE_MAKE_OPTS_ARRAY}"
--- 772,778 ----
        export CC=clang
      fi
      ${!PACKAGE_CONFIGURE:-./configure} --prefix="${!PACKAGE_PREFIX_PATH:-$PREFIX_PATH}" \
!       $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
    ) >&4 2>&1
  
    { "$MAKE" $MAKE_OPTS ${!PACKAGE_MAKE_OPTS} "${!PACKAGE_MAKE_OPTS_ARRAY}"

それで、pyenv で python を再インストールすれば良い。

$ pyenv uninstall 3.7.5
$ pyenv install 3.7.5
$ python -m tkinter

うまく行った。

26
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?