Сообщить об ошибке.

Сборка и установка Python 3.x из исходников (Ubuntu, Debian)

Загрузка исходников.

  • переходим на страницу загрузки Python v.3 официального сайта языка программирования Python;
  • выбираем нужную Вам версию Python из столбика "Release version", жмем на ссылку.
  • открывшуюся страницу прокручиваем вниз и загружаем исходники Python - "Gzipped source tarball", которые будем компилировать...

Конфигурирование, сборка и установка.

Для основного интерпретатора CPython требуется только компилятор языка C, НО для некоторых модулей стандартной библиотеки Python (например, модуль сжатия zlib или модуль базы данных sqlite3) потребуются установить дополнительные системные библиотеки.

Установка основных зависимостей для сборки Python3:

Примечание: команда установки sudo apt install ... записана в 3 строки, что бы уместить библиотеки на экране без горизонтальной прокрутки.Обратите внимание, что это только основные зависимости, для успешной сборки Python

$ sudo apt update -y
$ sudo apt install -y build-essential zlib1g-dev libffi-dev libsqlite3-dev libncurses5-dev
$ sudo apt install -y libncursesw5-dev libreadline6-dev libdb5.3-dev
$ sudo apt install -y libgdbm-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev tk-dev

Установка всех зависимостей для полной сборки и установки Python3:

Применительно к Debian, Ubuntu и других систем на базе установщика apt.

Во-первых, убедитесь, что в списке источников sources.list включены пакеты с исходными кодами. Это можно сделать, добавив строку с расположением scr пакетов, включая URL-адрес, имя дистрибутива и имя компонента в файл /etc/apt/sources.list.

# на примере дистрибутива Ubuntu 20.4 (Focal)
deb-src http://archive.ubuntu.com/ubuntu/ focal main

# на примере дистрибутива Debian 10 (Buster)
deb-src http://deb.debian.org/debian/ buster main

Затем вы должны обновить индекс пакетов и установить зависимости сборки через команду apt:

$ sudo apt-get update
$ sudo apt-get build-dep python3.10

Если этот пакет недоступен в вашей системе, то попробуйте уменьшить версию до тех пор, пока не найдете доступный пакет. Например:

$ sudo apt-get build-dep python3.9

Внимание! Если пакет для сборки, например Python3.10 недоступен в вашем дистрибутиве (а доступен только например Python3.8), то это не значит что версию Python3.10 нельзя установить в такую систему. Просто некоторые модули стандартной библиотеки Python используют системную библиотеку версией выше и ее нет в вашем дистрибутиве. В итоге модуль использующий библиотеку, которой нет, просто не скомпилируется и не будет работать в итоговой сборке.

И так, имеем скачанный Python нужной версии, допустим это будет версия 3.x.x (x - цифры нужной версии ), в формате GZIP и с расширением .tgz. Распакуем архив с исходниками Python-3.x.x.tgz, при этом создастся папка Python-3.x.x, в которую затем перейдем.

# Распаковываем
$ tar xvf Python-3.x.x.tgz
# Переходим в папку
$ cd Python-3.x.x

Теперь нужно сконфигурировать установку командой ./configure. Определимся, куда мы будем ставить нужный нам Python и укажем этот директорий в конфигурации. Обычно не системные приложения в Linux ставятся в папку /opt, следовательно, будем ставить в директорию /opt/Python-3.x.x/, где .x.x - обозначают версию Python.

# компилируется быстро
$ ./configure --prefix=/opt/python-3.x.x/

# компилируется медленно, но потом работает быстрее
$ ./configure --prefix=/opt/python-3.x.x/ --enable-optimizations
  • Включение флага --enable-optimizations позволяет оптимизировать профилирование PGO - оптимизация профиля [лучшая подготовка, поддержка llvm и т.д.] и оптимизацию LTO - времени связи для GCC и CLANG. Оба являются дорогостоящими оптимизациями, которые замедляют процесс сборки, но дают значительное повышение скорости примерно на 10-20%.
  • Включение флага --with-lto использует возможность последних наборов инструментов компилятора для оптимизации через произвольную границу файла .o при создании окончательных исполняемых файлов или общих библиотек для дополнительного повышения производительности.
  • Для поддержки часового пояса по умолчанию, начиная с версии Python 3.9, при компиляции можно указать флаг --with-tzpath, который должен быть строкой, разделенной os.pathsep и указывать на данные о часовых поясах в системе.
  • Все флаги конфигурации можно посмотреть командой ./configure -help.

Далее скомпилируем Python и установим в директорию, указанную в конфигурации:

# компиляция, займет продолжительное время
$ make -j4
# установка
$ sudo make altinstall

Команда make -c -j4 создаст CPython с выводом только предупреждений и ошибок в stderr и будет использовать до 2-x ядер ЦП. Если вы используете машину с более чем четырьмя ядрами или одноядерную машину, то измените число, переданное в флаг -j, в соответствии с количеством ядер, которые у вас есть

После удачной установки, для удобного вызова Python, добавим aliases для текущей сессии терминала:

# Для интерпретатора
$ alias py3.x.x=”/opt/python-3.x.x/bin/python″
# Для системы управления пакетами pip
$ alias pip3.x.x=”/opt/python-3.x.x/bin/pip″
# Теперь, чтобы вызвать установленный Python, вводим команду
$ py3.x.x
# Чтобы вызвать pip установленного Python
$ pip3.x.x

После закрытия терминала созданные нами aliases удалятся. Что бы создать постоянные aliases, добавим их в файл Вашего профиля .basrc

# Пока так НЕ делайте.
$ echo 'alias py3.x.x=”/opt/python-3.x.x/bin/python″' >> ~/.bashrc 
$ echo 'alias pip3.x.x=”/opt/python-3.x.x/bin/pip″' >> ~/.bashrc 
# Теперь сторонние пакеты будем ставить так
$ sudo pip3.x.x install numpy matplotlib pandas

И все же, при установке сторонних модулей и пакетов, мы все еще пользуемся привилегиями суперпользователя sudo, а это в системах Linux не приветствуется.

Чтобы избежать этого и других неприятных ситуаций, а так же пользоваться Python согласно "религии" и по "фен шуй", нужно перенести его экземпляр в виртуальное окружение.