Python – Setup and build

Говорят, бесконечно можно смотреть на три вещи: как горит огонь, как течет вода и как работают другие люди…

Возможно в список стоит добавить четвертый пункт: как обновляются пакеты в официальном репозитории Debian 10 или CentOS 7. Например, когда тебе нужна одинаковая версия Python на всех операционных системах, а в официальном репозитории доступен только релиз, которому уже больше года.

На самом деле, проблемы нет, последний релиз для Windows и MacOS можно найти на официальной странице загрузки.
Либо скачать необходимую версию с официального ftp-сервера:

version=3.9.5
wget https://www.python.org/ftp/python/$version/python-$version-amd64.exe
wget https://www.python.org/ftp/python/$version/python-$version-macos11.pkg

В случае с Linux необходимую версию можно собрать из исходных кодов самостоятельно или воспользоваться готовым сценарием сборки:

sudo su - -c "bash <(curl -s https://git.hmp.today/pavel.muhortov/utils/raw/branch/master/build-python.sh) qn 3.9.5 install-python.log"

Сборка Python из исходных кодов

  • Установка пакетов, необходимых для сборки
# debian
sudo apt update && sudo apt upgrade -y
sudo apt-get install -y build-essential tk-dev libncurses5-dev \
libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev \
libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libffi-dev
# centos
sudo yum install -y gcc openssl-devel bzip2-devel libffi-devel zlib-devel xz-devel
  • Скачивание и распаковка необходимой версии исходных кодов
subvers=3.9.5
version=$(echo $subvers | cut -d. -f1,2)
wget https://www.python.org/ftp/python/$subvers/Python-$subvers.tgz
tar zxf Python-$subvers.tgz
  • Сборка 4мя ядрами процессора и установка собранного пакета
cd Python-$subvers
./configure --enable-optimizations --prefix=/usr/local/opt/python-$subvers
make -j4
sudo make altinstall
  • Очистка после установки
cd ..
sudo rm -r Python-$subvers*
# debian
sudo apt autoremove -y
# centos
sudo yum autoremove -y

Если изменить основную символическую ссылку, что-нибудь может сломаться:

sudo rm /usr/bin/python3 && sudo ln /usr/local/opt/python-$version/bin/python$version /usr/bin/python3

Как минимум придется ремонтировать lsb_release:

sudo sed -i "s/\/usr\/bin\/python3 -Es/\/usr\/bin\/python3.7 -Es/" /usr/bin/lsb_release
  • Поэтому лучше определить обновленную версию Python только для текущего пользователя
sudo ln /usr/local/opt/python-$version/bin/python$version /usr/bin/python$version
echo "alias python3=python$version" >> ~/.bashrc
echo "alias pip3=pip$version" >> ~/.bashrc
source ~/.bashrc
  • Можно создавать виртуальное окружение, устанавливать дополнительные пакеты и пользоваться
/usr/bin/python3.9 -m venv .venv
cd .venv
source ./bin/activate
pip install django
pip install djangorestframework
deactivate
  • Для деинсталляции пакета достаточно удалить каталог установки
sudo rm -rf /usr/local/opt/python-$version