Для основного интерпретатора 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 согласно "религии" и по "фен шуй", нужно перенести его экземпляр в виртуальное окружение.