Могу ли я сделать Tkinter доступным в виртуальных средах, не включая его в системный Python?

Вопрос или проблема

Я использую Linux Mint 20.3 Cinnamon и у меня есть несколько созданных виртуальных окружений (с использованием стандартной библиотеки venv) на системном Python (других установок Python нет), версия которого 3.8.10. Я знаю, что системный Python был настроен без поддержки TKinter:

>>> import _tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named '_tkinter'
>>> import tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'tkinter'
>>> import turtle
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/turtle.py", line 107, in <module>
    import tkinter as TK
ModuleNotFoundError: No module named 'tkinter'

Любопытно, что модуль turtle присутствует (и не удается импортировать, потому что tkinter отсутствует), хотя tkinter нет (и он не сможет быть импортирован, потому что отсутствует _tkinter).

Я понимаю, что мне следует сделать TKinter доступным глобально, установив системный пакет python3-tk; и я понимаю, что TKinter зависит от не-Python кода, который нужно установить в любом случае (и не на основе каждого виртуального окружения).

Однако: насколько я понимаю, установка python3-tk также, как и установка соответствующего кода TCL/Tk, обновит системный Python для включения стандартного пакета библиотеки tkinter. В принципе, я хотел бы этого избежать. Я предполагаю, что отсутствие этого пакета является преднамеренным выбором команды Mint (особенно учитывая, что он даже отсутствует в Cinnamon) с положительными последствиями для безопасности (злоумышленный скрипт на Python не сможет воспользоваться гипотетической уязвимостью Tcl/Tk, обнаруженной в будущем, кроме как в уровне пользователя venv).

Судя по всему, в моей системе уже установлен этот код TCL:

$ apt list tcl
Listing... Done
tcl/focal,now 8.6.9+1 amd64 [installed]
tcl/focal 8.6.9+1 i386

Возможно ли настроить мою систему так, чтобы

  • основной код TCL/Tk был доступен и использовался из виртуальных окружений Python;
  • каждое новое виртуальное окружение, которое я создаю, могло получить Python привязки (т.е. стандартный пакет библиотеки tkinter) к этому коду из какого-то стандартного источника; но
  • системный Python не изменялся (и по задумке не мог выполнять код GUI Tkinter)?

Если да, то как?

И что точно предлагает для установки python3-tk?

Единственный способ сделать это — зависеть от поддержки пакетов (например, если они сделают его доступным также на pip, а не отдельно для установки Python). virtualenv и pip идут рука об руку.

Создание символических ссылок вместо копирования библиотек (и соответствующих файлов) также работает, как было показано в ответе на SO.

Наконец, вы можете, конечно, скомпилировать Python из исходников и заставить его работать внутри определенной директории, вместо того чтобы устанавливать его глобально (например, как это делает virtualenv), но это может сломать некоторые существующие (Python) приложения, если сделать это неправильно (например, этим занимаются такие проекты, как homebrew/linuxbrew).

Хорошим существующим решением для этого будет pyenv. Учтите, что он все равно будет компилировать из исходников, но будет делать это в одной директории (либо заданной, либо в скрытой директории в $HOME). Он не будет заменой virtualenv, но предотвратит редактирование системных файлов (поскольку не копирует скомпилированные бинарные файлы глобально/по системе).

Ответ или решение

Возможность использования Tkinter в виртуальных средах без изменения системного Python на Linux Mint 20.3

Введение

Вы столкнулись с ситуацией, когда на вашей системе Linux Mint 20.3 нет поддержки Tkinter, и хотите сделать эту библиотеку доступной в виртуальных окружениях, не затрагивая при этом системную версию Python. Давайте детально разберем возможные подходы к решению этой задачи.

Понимание проблемы

Исходя из вашего описания, вы уже знаете, что установка пакета python3-tk добавит поддержку Tkinter в системный Python. Однако вы предпочли бы избежать внесения изменений в системные компоненты Python, что вполне разумно, учитывая аспекты безопасности и управления зависимостями.

Решения для работы с Tkinter в виртуальных окружениях

Существуют несколько путей, чтобы подключить поддержку Tkinter в ваши виртуальные окружения, не изменяя системный Python.

1. Установка и настройка Pyenv

Pyenv — это инструмент, позволяющий управлять версиями Python и устанавливать новые версии в локальные каталоги, не влияя на системные настройки. Процесс следующий:

  1. Установите Pyenv, следуя инструкциям на официальном репозитории.
  2. С помощью Pyenv вы можете установить версию Python, которая поддерживает Tkinter. Это можно сделать следующим образом:
    PYTHON_CONFIGURE_OPTS="--enable-optimizations" pyenv install 3.8.10
  3. Активируйте нужную версию Python в каталоге вашего проекта:
    cd ваш_проект
    pyenv local 3.8.10
  4. Создайте виртуальное окружение с помощью этой версии Python:
    python -m venv venv
  5. Активируйте виртуальное окружение:
    source venv/bin/activate

Теперь у вас будет версия Python с поддержкой Tkinter в вашем виртуальном окружении.

2. Компиляция Python из источников

Вы также можете самостоятельно скомпилировать Python с поддержкой Tkinter и установить его в отдельную директорию:

  1. Убедитесь, что на вашей системе установлены необходимые библиотеки:
    sudo apt-get install tk-dev
  2. Скачайте исходный код Python с официального сайта.
  3. Распакуйте архив, перейдите в директорию с исходниками и выполните следующие команды:
    ./configure --prefix=$HOME/.local
    make
    make install
  4. Убедитесь, что путь $HOME/.local/bin добавлен в переменную окружения $PATH.
  5. Теперь создавайте виртуальные окружения с использованием данной сборки Python.
3. Символические ссылки

Этот метод немного более рискованный и может вызвать проблемы с совместимостью, но он технически осуществим. Вы можете создать символические ссылки на библиотеки Tkinter, установленные в системном Python, в каталоги вашего виртуального окружения. Это делает вашу систему зависимой от библиотек, находящихся вне вашего окружения, и не рекомендуется для продакшн-окружений.

Заключение

Ваше стремление избежать изменений в системном Python оправдано, и вышеописанные методы позволят вам использовать Tkinter в ваших виртуальных окружениях. Выбор метода зависит от ваших предпочтений и уровня комфорта с управлением Python. Использование Pyenv является наилучшей практикой в данной ситуации, так как оно обеспечивает удобное управление версиями и изоляцию окружений.

Если у вас есть дополнительные вопросы по настройке или использованию вышеописанных методов, не стесняйтесь обращаться за дополнительной информацией.

Оцените материал
Добавить комментарий

Капча загружается...