Для основного интерпретатора CPython требуется только компилятор языка C, НО для некоторых модулей стандартной библиотеки Python (например, модуль сжатия zlib
или модуль базы данных sqlite3
) потребуются установить дополнительные системные библиотеки.
Примечание: команда установки 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
Применительно к 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
при создании окончательных исполняемых файлов или общих библиотек для дополнительного повышения производительности.--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 согласно "религии" и по "фен шуй", нужно перенести его экземпляр в виртуальное окружение.