В этой статье я покажу как можно установить несколько разных версий Python 3 на Linux, на примере дистрибутива Debian 12.
Введение
Бывает так, что приходится поддерживать старый проект, например написанный на какой-нибудь из старых версий Python 3. При этом хочется использовать современную операционную систему. На Windows довольно легко установить несколько разных версий Python 3, но дистрибутивы Linux обычно в своих репозиториях хранят одну версию Python 3. Например, репозитории для Debian:
- Debian Bookworm (12) — Python 3.11;
- Debian Bullseye (11) — Python 3.9;
- Debian Buster (10) — Python 3.7;
- Debian Stretch (9) — Python 3.5, и так далее.
Но Python 3 можно установить не только из репозиториев, его можно скомпилировать из исходных кодов.
В этой статье я буду компилировать Python 3.7 на Debian 12. А затем, с помощью инструмента update-alternatives укажем какую версию Python 3 нужно использовать по умолчанию.
Кстати эта статья основана на англоязычной статье — ссылка. Но это не совсем перевод, я кое-что дополнил, а кое-что сделал по другому, но за основу взял именно эту статью.
Установка Python 3.7 на Debian 12
Подготовка
Все действия мы будем выполнять под пользователем root.
Перед компилированием обновим систему и установим необходимые пакеты. В основном это инструменты для компилирования и необходимые зависимости.
# apt update -y && apt upgrade -y # apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev -y
Теперь скачаем необходимую версию Python 3, в нашем примере это Python-3.7.16.tar.xz:
# wget https://www.python.org/ftp/python/3.7.16/Python-3.7.16.tar.xz
Распакуем архив в каталог /usr/local/share/python3.7, предварительно создав его:
# mkdir -p /usr/local/share/python3.7 # tar -xf Python-3.7.16.tar.xz -C /usr/local/share/python3.7
Компилирование
Теперь войдём в этот каталог и выполним configure с необходимыми флагами:
- Флаг —enable-optimizations предписывает сценарию выполнить несколько проверок, чтобы убедиться в наличии всех зависимостей, и оптимизирует двоичный файл Python путем запуска нескольких тестов.
- Флаг —enable-shared создает разделяемые библиотеки, которые необходимы для определенных типов приложений.
- Флаг —with-ensurepip=install — дополнительно установит нужную версию pip пакетного менеджера.
# cd /usr/local/share/python3.7/Python-3.7.16 # ./configure --enable-optimizations --enable-shared --with-ensurepip=install
Теперь пришло время скомпилировать исходный код с помощью команды make. Вы, дополнительно, можете указать количество потоков, для использования нескольких ядер. Например, если у вас 4 ядра, вы можете запустить компилирование в 3 потока с помощью опции -j 3.
# make -j 3
Как только компилирование будет завершена, установите двоичные файлы Python. Рекомендуется использовать команду make altinstall, чтобы избежать перезаписи двоичного файла Python по умолчанию в системе.
# make altinstall
После установки, обязательно, настройте привязки динамического компоновщика. Пропуск этого важного шага может вызвать проблемы.
# ldconfig /usr/local/share/python3.7
Давайте проверим установку, проверив версию Python, чтобы подтвердить, что установка Python 3.7 прошла успешно и готова к использованию.
# python3.7 --version Python 3.7.16
Кстати, в системе также установлена другая версия Python 3, которая сейчас используется по умолчанию:
# python3 --version Python 3.11.2
Настройка версии Python 3 по умолчанию
Эти версии Python находятся в разных местах файловой системы:
# which python3.7 /usr/local/bin/python3.7 # which python3 /usr/bin/python3
Теперь можем, с помощью инструмента update-alternatives, указать какую версию Python 3 использовать.
Для начала установим обе версии в качестве альтернатив. Вначале указываем путь к программе (/usr/bin/python), затем называем группу ссылок (python), затем путь к программе (/usr/local/bin/python3.7 или /usr/bin/python3.11) и приоритет для этой группы.
# update-alternatives --install /usr/bin/python python /usr/local/bin/python3.7 1 # update-alternatives --install /usr/bin/python python /usr/bin/python3.11 2
А с помощью следующей команды мы можем выбирать версию Python 3 в интерактивном режиме:
# update-alternatives --config python Есть 2 варианта для альтернативы python (предоставляет /usr/bin/python). Выбор Путь Приор Состояние ------------------------------------------------------------ * 0 /usr/bin/python3.11 2 автоматический режим 1 /usr/bin/python3.11 2 ручной режим 2 /usr/local/bin/python3.7 1 ручной режим Нажмите «enter», чтобы не менять текущий выбор[*], или введите нужное число:
Либо можем использовать не интерактивный режим:
# update-alternatives --list python /usr/bin/python3.11 /usr/local/bin/python3.7 # update-alternatives --set python /usr/bin/python3.11 # python --version Python 3.11.2 # update-alternatives --set python /usr/local/bin/python3.7 # python --version Python 3.7.16