furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

Problem z brakiem Tkinter/Turtle/IDLE po instalacji Pythona z użyciem Pyenv

2019.02.18 - poniedziałek / kategoria: Python / tagi: python /

pyenv pozwala na instalację różnych wersji Pythona. Ściąga on kod źródłowy i kompiluje go. Do kompilacji niektórych modułów może jednak wymagać doinstalowania dodatkowych bibliotek - zwłaszcza takich zawierających -dev w nazwie.

Takich dodatkowych bibliotek wymaga moduł tkitner (a także sqlite3 i kilka innych ale to tutaj pominę).

pydev podczas instalacji nie informuje, że kompiluje bez obsługi tkinter choć (jak w poniższym przykładzie) informuje, że pomija kompilację innych sqlite3 z powodu braku wymaganych bibliotek.

$ pyenv install 3.7.2

Downloading Python-3.7.2.tar.xz...
-> https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
Installing Python-3.7.2...
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
Installed Python-3.7.2 to /home/furas/.pyenv/versions/3.7.2

Dopiero podczas importu tkinter wychodzi na jaw, że brak jest biblioteki _tkinter.

$ .pyenv/versions/3.7.2/bin/python

Python 3.7.2 (default, Feb 18 2019, 01:28:12)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/furas/.pyenv/versions/3.7.2/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'

To samo można zobaczyć przy użyciu -m tkinter.

$ .pyenv/versions/3.7.2/bin/python -m tkinter

Traceback (most recent call last):
  File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 183, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 142, in _get_module_details
    return _get_module_details(pkg_main_name, error)
  File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 109, in _get_module_details
    __import__(pkg_name)
  File "/home/furas/.pyenv/versions/3.7.2/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'

Ten sam problem jest z turtle i turtledemo, które zbudowane są w oparciu o tkinter.

$ .pyenv/versions/3.7.2/bin/python -m turtle

Traceback (most recent call last):
  File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/turtle.py", line 107, in <module>
    import tkinter as TK
  File "/home/furas/.pyenv/versions/3.7.2/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'
$ .pyenv/versions/3.7.2/bin/python -m turtledemo

Traceback (most recent call last):
  File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/furas/.pyenv/versions/3.7.2/lib/python3.7/turtledemo/__main__.py", line 91, in <module>
    from tkinter import *
  File "/home/furas/.pyenv/versions/3.7.2/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'

To samo może być przy uruchamianiu idle, które także zbudowane jest w oparciu o tkinter.

$ .pyenv/versions/3.7.2/bin/idle

** IDLE can't import Tkinter.
Your Python may not be configured for Tk. **

tkinter do samego działania wymaga tcl, tk, a do kompilacji jeszcze tcl-dev, tk-dev.

Wystarczyć jednak doinstalować samo tk-dev a pozostałe biblioteki zostaną automatycznie też zainstalowane.

$ apt install tk-dev

Mając potrzebne biblioteki należy usunąć Pythona i ponownie go zainstalować.

$ pyenv uninstall 3.7.2

$ pyenv install 3.7.2

Ten sam problem może być przy samodzielnym kompilowaniu kodu źródłowego ale kompilacja może podawać więcej informacji o brakujących biblitekach i można łatwiej zauważyć, że tkinter nie został skompilowany.


Uwaga: lista wersji Pythona możliwych do instalacji za pomoca pyenv

$  pyenv install --list
Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury