Встановлення основних версій Python на Debian Trixie
Дуже, дуже часто доводиться стикатися з необхідністю використання певної версії Пітона, наприклад, для torch, або чогось специфічного.
Використовувати conda або Docker у зв’язці з nvidia-container-toolkit і потім налаштовувати образи наприклад nvidia/cuda:13.0.1-runtime-ubuntu22.04 мені відчувається протиприродно, хоча часто так робив.
Та й у контейнері доводиться встановлювати додаткові пакети.
Простіше і зручніше зібрати все на хостовій системі, але при цьому не допустити контамінації всієї системи сторонніми бібліотеками та файлами.
Далі наводиться приклад компіляції кількох версій Python тільки для групи verpy, що дещо зручніше, ніж встановлення лише для одного користувача.
ai- довільний користувач, від якого здійснюється компіляція.verpy- група, якою буде дозволено використання.
1 2 3 4 | apt install \ build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \ wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev \ liblzma-dev libgdbm-dev libnsl-dev libgdbm-compat-dev |
mkdir /opt/openssl
mkdir /opt/python
groupadd --gid 42398 verpy
usermod -aG verpy ai
На час встановлення даємо доступ
chown ai:verpy /opt/openssl /opt/python
chmod u=rwX,g=rX,o-rwXx /opt/openssl /opt/python
Перемикаємося на користувача від якого буде виробляється компіляція та встановлення
/usr/bin/sudo-rs --login --user ai /bin/bash
mkdir -p $HOME/src/openssl
cd $HOME/src/openssl
Встановлення необхідних версій openssl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | # 1.0.2u > python 3.7 wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_0_2u/openssl-1.0.2u.tar.gz wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_0_2u/openssl-1.0.2u.tar.gz.asc wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_0_2u/openssl-1.0.2u.tar.gz.sha256 gpg --keyserver keys.gnupg.net --recv-keys 8657ABB260F056B1E5190839D9C4D26D0E604491 gpg --verify openssl-1.0.2u.tar.gz.asc tar zxf openssl-1.0.2u.tar.gz && cd openssl-1.0.2u ./config --prefix=/opt/openssl/1.0.2u --openssldir=/opt/openssl/1.0.2u/ssl make -j8 make install_sw # exec bash - реініціалізує та скидає всі змінні оточення, які можуть залишитися від попередньої установки exec bash cd $HOME/src/openssl # 1.1.1w > python 3.9 wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz.asc wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz.sha256 gpg --keyserver keys.gnupg.net --recv-keys EFC0A467D613CB83C7ED6D30D894E2CE8B3D79F5 gpg --verify openssl-1.1.1w.tar.gz.asc tar zxf openssl-1.1.1w.tar.gz && cd openssl-1.1.1w ./config --prefix=/opt/openssl/1.1.1w --openssldir=/opt/openssl/1.1.1w/ssl make -j8 make install_sw exec bash cd $HOME/src/openssl # 3.0.17 > python 3.10 ; 3.11 wget https://github.com/openssl/openssl/releases/download/openssl-3.0.17/openssl-3.0.17.tar.gz wget https://github.com/openssl/openssl/releases/download/openssl-3.0.17/openssl-3.0.17.tar.gz.asc wget https://github.com/openssl/openssl/releases/download/openssl-3.0.17/openssl-3.0.17.tar.gz.sha256 gpg --keyserver keys.gnupg.net --recv-keys BA5473A2B0587B07FB27CF2D216094DFD0CB81EF gpg --verify openssl-3.0.17.tar.gz.asc tar zxf openssl-3.0.17.tar.gz && cd openssl-3.0.17 ./config --prefix=/opt/openssl/3.0.17 --openssldir=/opt/openssl/3.0.17/ssl make -j8 make install_sw exec bash cd $HOME/src/openssl # 3.5.4 > python 3.12 wget https://github.com/openssl/openssl/releases/download/openssl-3.5.4/openssl-3.5.4.tar.gz wget https://github.com/openssl/openssl/releases/download/openssl-3.5.4/openssl-3.5.4.tar.gz.asc wget https://github.com/openssl/openssl/releases/download/openssl-3.5.4/openssl-3.5.4.tar.gz.sha256 gpg --keyserver keys.gnupg.net --recv-keys BA5473A2B0587B07FB27CF2D216094DFD0CB81EF gpg --verify openssl-3.5.4.tar.gz.asc tar zxf openssl-3.5.4.tar.gz && cd openssl-3.5.4 ./config --prefix=/opt/openssl/3.5.4 --openssldir=/opt/openssl/3.5.4/ssl make -j8 make install_sw exec bash cd $HOME/src |
Встановлення Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | mkdir -p $HOME/src/python cd $HOME/src/python # python 3.7.17 wget https://www.python.org/ftp/python/3.7.17/Python-3.7.17.tar.xz wget https://www.python.org/ftp/python/3.7.17/Python-3.7.17.tar.xz.asc gpg --keyserver keys.gnupg.net --search-keys 0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D gpg --verify Python-3.7.17.tar.xz.asc tar xvf Python-3.7.17.tar.xz && cd Python-3.7.17 LDFLAGS="${LDFLAGS} -Wl,-rpath=/opt/openssl/1.1.1w/lib" ./configure --prefix=/opt/python/3.7.17 --enable-optimizations --with-openssl=/opt/openssl/1.1.1w --with-lto --with-computed-gotos --with-system-ffi make -j8 make test make install exec bash cd $HOME/src/python # python 3.9.19 wget https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tar.xz wget https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tar.xz.asc gpg --keyserver keys.gnupg.net --search-keys E3FF2839C048B25C084DEBE9B26995E310250568 gpg --verify Python-3.9.19.tar.xz.asc tar xvf Python-3.9.19.tar.xz && cd Python-3.9.19 LDFLAGS="${LDFLAGS} -Wl,-rpath=/opt/openssl/1.1.1w/lib" ./configure --prefix=/opt/python/3.9.19 --enable-optimizations --with-openssl=/opt/openssl/1.1.1w --with-lto --with-computed-gotos --with-system-ffi make -j8 make test make install exec bash cd $HOME/src/python # python 3.9.25 wget https://www.python.org/ftp/python/3.9.25/Python-3.9.25.tar.xz wget https://www.python.org/ftp/python/3.9.25/Python-3.9.25.tar.xz.asc gpg --keyserver keys.gnupg.net --search-keys E3FF2839C048B25C084DEBE9B26995E310250568 gpg --verify Python-3.9.25.tar.xz.asc tar xvf Python-3.9.25.tar.xz && cd Python-3.9.25 LDFLAGS="${LDFLAGS} -Wl,-rpath=/opt/openssl/1.1.1w/lib" ./configure --prefix=/opt/python/3.9.25 --enable-optimizations --with-openssl=/opt/openssl/1.1.1w --with-lto --with-computed-gotos --with-system-ffi make -j8 make test make install exec bash cd $HOME/src/python # python 3.10.19 wget https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tar.xz wget https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tar.xz.asc gpg --keyserver keys.gnupg.net --search-keys CFDCA245B1043CF2A5F97865FFE87404168BD847 gpg --verify Python-3.10.19.tar.xz.asc tar xvf Python-3.10.19.tar.xz && cd Python-3.10.19 LDFLAGS="${LDFLAGS} -Wl,-rpath=/opt/openssl/3.0.17/lib" ./configure --prefix=/opt/python/3.10.19 --enable-optimizations --with-openssl=/opt/openssl/3.0.17 --with-lto --with-computed-gotos --with-system-ffi make -j8 make test make install exec bash cd $HOME/src/python # python 3.11.14 wget https://www.python.org/ftp/python/3.11.14/Python-3.11.14.tar.xz wget https://www.python.org/ftp/python/3.11.14/Python-3.11.14.tar.xz.asc gpg --keyserver keys.gnupg.net --search-keys CFDCA245B1043CF2A5F97865FFE87404168BD847 gpg --verify Python-3.11.14.tar.xz.asc tar xvf Python-3.11.14.tar.xz && cd Python-3.11.14 LDFLAGS="${LDFLAGS} -Wl,-rpath=/opt/openssl/3.0.17/lib" ./configure --prefix=/opt/python/3.11.14 --enable-optimizations --with-openssl=/opt/openssl/3.0.17 --with-lto --with-computed-gotos --with-system-ffi make -j8 make test make install exec bash cd $HOME/src/python # python 3.12.12 wget https://www.python.org/ftp/python/3.12.12/Python-3.12.12.tar.xz wget https://www.python.org/ftp/python/3.12.12/Python-3.12.12.tar.xz.asc gpg --keyserver keys.gnupg.net --search-keys 7169605F62C751356D054A26A821E680E5FA6305 gpg --verify Python-3.12.12.tar.xz.asc tar xvf Python-3.12.12.tar.xz && cd Python-3.12.12 LDFLAGS="${LDFLAGS} -Wl,-rpath=/opt/openssl/3.5.4/lib" ./configure --prefix=/opt/python/3.12.12 --enable-optimizations --with-openssl=/opt/openssl/3.5.4 --with-lto --with-computed-gotos make -j8 make test make install exec bash |
strip - за вашим бажанням
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # [ --strip-all | --strip-unneeded ] strip --strip-unneeded /opt/python/3.10.19/bin/python3.10 strip --strip-unneeded /opt/python/3.11.14/bin/python3.11 strip --strip-unneeded /opt/python/3.12.12/bin/python3.12 strip --strip-unneeded /opt/python/3.7.17/bin/python3.7 strip --strip-unneeded /opt/python/3.7.17/bin/python3.7m strip --strip-unneeded /opt/python/3.9.19/bin/python3.9 strip --strip-unneeded /opt/python/3.9.25/bin/python3.9 strip --strip-unneeded /opt/openssl/1.0.2u/bin/openssl strip --strip-unneeded /opt/openssl/1.1.1w/bin/openssl strip --strip-unneeded /opt/openssl/3.0.17/bin/openssl strip --strip-unneeded /opt/openssl/3.5.4/bin/openssl exit |
А тепер забираємо права на запис
Все, Openssl та Пітон встановлені, доступ на запис можна потрібно прибрати.
Доступ на читання, вхід до директорії та виконання лише для групи verpy.
Решта користувачів ніяк не будуть перетинатися з цими пакетами, це не FrankenDebian.
chown -R nobody:verpy /opt/openssl /opt/python
chmod -R u=r,g=rXx,o-rwXx /opt/openssl /opt/python
Лінківка всіх версій Пітона
Під користувачем ai запустимо ось такий скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/bin/bash if [[ ! -d "$HOME/.local/bin" ]]; then mkdir -p $HOME/.local/bin fi declare -A dirs=( ["3.7.17"]="2to3-3.7 easy_install-3.7 idle3.7 pip3.7 pydoc3.7 python3.7 python3.7m pyvenv-3.7 python3.7m-config" ["3.9.25"]="2to3-3.9 idle3.9 pip3.9 pydoc3.9 python3.9 python3.9-config" ["3.10.19"]="2to3-3.10 idle3.10 pip3.10 pydoc3.10 python3.10 python3.10-config" ["3.11.14"]="2to3-3.11 idle3.11 pip3.11 pydoc3.11 python3.11 python3.11-config" ["3.12.12"]="2to3-3.12 idle3.12 pip3.12 pydoc3.12 python3.12 python3.12-config" ) for dir in "${!dirs[@]}"; do printf '%s\n' "$dir" bins="${dirs[$dir]}" for bin in ${bins}; do printf '/opt/python/%s/bin/%s > ~/.local/bin/%s\n' "${dir}" "$bin" "$bin" ln -sf /opt/python/${dir}/bin/${bin} $HOME/.local/bin/${bin} done bins='' done |
Трохи тестів
import ssl
ssl.OPENSSL_VERSION
import sys
print(sys.executable)
python3.7
1 2 3 4 5 6 7 8 9 | Python 3.7.17 (default, Dec 22 2025, 10:58:22) [GCC 14.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import ssl >>> ssl.OPENSSL_VERSION 'OpenSSL 1.1.1w 11 Sep 2023' >>> import sys >>> print(sys.executable) /home/ai/.local/bin/python3.7 |
python3.12
1 2 3 4 5 | Python 3.12.12 (main, Dec 22 2025, 12:33:21) [GCC 14.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import ssl >>> ssl.OPENSSL_VERSION 'OpenSSL 3.5.4 30 Sep 2025' |
Встановимо torch c python 3.10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | mkdir ~/.torch_env/ python3.10 -m venv ~/.torch_env/ source ~/.torch_env/bin/activate which pip3 # /home/ai/.torch_env/bin/pip3 which python3.10 # /home/ai/.torch_env/bin/python3.10 python3.10 -m pip install --upgrade pip pip3 install torch numpy python3.10 from torch import cuda print(cuda.get_device_name(cuda.current_device())) |
1 2 3 4 5 6 | python3.10 Python 3.10.19 (main, Dec 22 2025, 11:39:18) [GCC 14.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from torch import cuda >>> print(cuda.get_device_name(cuda.current_device())) NVIDIA RTX A3000 Laptop GPU |
Якщо деякі тести не пройшли перевірку
Можна продовжити установку, а потім пройти цей же тест під тестованою версією Пітон:
1 2 | 1 test failed:
test_urllib2
|
cd ~/src/python/Python-3.7.17/Lib
1 2 3 | /opt/python/3.7.17/bin/python3.7 -m test test_ssl /opt/python/3.7.17/bin/python3.7 -m test test_urllib2 == Tests result: SUCCESS == |
Оригінальний пост на SecOps.it Blog • Встановлення основних версій Python на Debian Trixie