Установка разных версий Python 3 на Linux
Введение
Бывает так, что приходится поддерживать старый проект, например написанный на какой-нибудь из старых версий 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 нужно использовать по умолчанию.
Подготовка к установке
Все действия мы будем выполнять под пользователем root. Устанавливать будем Python 3.7 на Debian 12.
Перед компилированием обновим систему и установим необходимые пакеты. В основном это инструменты для компилирования и необходимые зависимости.
# 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
Если понравилась статья, подпишись на мой канал в VK или Telegram .