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

Сборка и установка 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 при создании окончательных исполняемых файлов или общих библиотек для дополнительного повышения производительности.

  • Поддержка загружаемых расширений модуля sqlite3 (по умолчанию - нет) включается параметром --enable-loadable-sqlite-extensions.

  • Для поддержки часового пояса по умолчанию, начиная с версии Python 3.9, при компиляции можно указать флаг --with-tzpath, который должен быть строкой, разделенной os.pathsep и указывать на данные о часовых поясах в системе.

  • Включение флага --disable-gil включает экспериментальную поддержку запуска Python без глобальной блокировки интерпретатора (GIL): многопоточная сборка (доступно в версии Python 3.13). Внимание! Возможно может потребоваться библиотека python3-dev от Python 3.13

  • Когда Python3 собирается с использованием параметра --enable-experimental-jit (доступно в версии Python 3.13), то добавляется компилятор, который может ускорить некоторые программы Python. Внимание! Возможно может потребоваться библиотека python3-dev от Python 3.13

    Внутренняя архитектура примерно следующая.

    • Все начинается со специализированного байт-кода уровня 1. (новое в Python 3.11)
    • Когда байт-код уровня 1 становится достаточно "горячим", он преобразуется в новый, чисто внутренний IR уровня 2, также известный как микрооперации ("uops").
    • IR уровня 2 использует ту же виртуальную машину на основе стека, что и уровень 1, но формат инструкций лучше подходит для перевода в машинный код.
    • Есть несколько проходов оптимизации для IR уровня 2, которые применяются перед интерпретацией или переводом в машинный код.
    • Существует интерпретатор уровня 2, но он в основном предназначен для отладки ранних этапов конвейера оптимизации. Интерпретатор уровня 2 можно включить, настроив Python с помощью --enable-experimental-jit=interpreter.
    • Когда JIT включен, оптимизированный IR уровня 2 преобразуется в машинный код, который затем выполняется.
    • В процессе трансляции машинного кода используется метод, называемый копированием и исправлением. У него нет зависимостей во время выполнения, но есть новая зависимость от LLVM во время сборки.

    Флаг --enable-experimental-jit имеет следующие необязательные значения:

    • no (по умолчанию) — отключить весь конвейер уровня 2 и JIT.
    • yes (по умолчанию, если флаг присутствует без необязательного значения) — включить JIT. Чтобы отключить JIT во время выполнения, передайте переменную среды PYTHON_JIT=0.
    • yes-off создаст JIT, но отключить его по умолчанию. Чтобы включить JIT во время выполнения, передайте переменную среды PYTHON_JIT=1
    • interpreter — включит интерпретатор уровня 2, но отключите JIT. Интерпретатор можно отключить, запустив PYTHON_JIT=0.
  • Все флаги конфигурации можно посмотреть командой ./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 согласно "религии" и по "фен шуй", нужно перенести его экземпляр в виртуальное окружение.