Встановлення основних версій 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
Перемикаємося на користувача від якого буде виробляється компіляція та встановлення su ai 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 ==
2025-12-24 19:55 +0000