
python-build-standalone のビルド済みバイナリをダウンロードするので高速で環境も汚さずに済む uv でPythonをインストールする手順。
Debian 12は、標準リポジトリで提供されている Python は python3.11のみ。
2025/03/23の時点では python3.13 は提供されていない。
ソースからビルドしてインストールすると、ビルドに必要な大量のパッケージをインストールしなければならないし、別のサーバーで deb をセルフビルドすれば環境を汚さずに済むけど、それはそれで面倒。
誰か Python バイナリ用意してくれないかな、と思ったら python-build-standalone が提供してくれていた。
手動でダウンロードするのは面倒だし、いい感じにインストールしてくれる管理システムがあればな、と思ったら uv が実現してくれていた。
素晴らしい。
確認のために用意した環境
前回の手順で 全ユーザー用に uv をインストール済みの Debian 12 を最小セットアップしたマシン
$ cat /etc/debian_version
12.9
uv で Debian 12 の全ユーザー用に Python 3.13 をインストール
uv python
サブコマンドについては後述
- -i オプションで全ユーザーがアクセスできるディレクトリにインストール
$ sudo uv python install 3.13 -i /opt/uv-python/ Installed Python 3.13.2 in 6.71s + cpython-3.13.2-linux-x86_64-gnu
- alternatives確認
$ update-alternatives --get-selections | grep python
- alternatives追加
$ sudo update-alternatives --install /usr/local/bin/python3.13 python3.13 /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 2 update-alternatives: /usr/local/bin/python3.13 (python3.13) を提供するために自動モードで /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 を使います
- alternatives確認
$ update-alternatives --get-selections | grep python python3.13 auto /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13
- Pythonバージョン確認
$ which python3.13 /usr/local/bin/python3.13 $ python3.13 --version Python 3.13.2
uv python サブコマンドの使い方
インストール済みPythonの確認
どのバージョンのPythonが入っているか確認するには uv python list
パスが通っている場所にあるPythonが表示されるので、Debianパッケージ版のPython 3.11も表示される。
$ uv python list
cpython-3.14.0a6+freethreaded-linux-x86_64-gnu <download available>
cpython-3.14.0a6-linux-x86_64-gnu <download available>
cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available>
cpython-3.13.2-linux-x86_64-gnu <download available>
cpython-3.12.9-linux-x86_64-gnu <download available>
cpython-3.11.11-linux-x86_64-gnu <download available>
cpython-3.11.2-linux-x86_64-gnu /usr/bin/python3.11
cpython-3.11.2-linux-x86_64-gnu /usr/bin/python3 -> python3.11
cpython-3.11.2-linux-x86_64-gnu /bin/python3.11
cpython-3.11.2-linux-x86_64-gnu /bin/python3 -> python3.11
cpython-3.10.16-linux-x86_64-gnu <download available>
cpython-3.9.21-linux-x86_64-gnu <download available>
cpython-3.8.20-linux-x86_64-gnu <download available>
cpython-3.7.9-linux-x86_64-gnu <download available>
pypy-3.11.11-linux-x86_64-gnu <download available>
pypy-3.10.16-linux-x86_64-gnu <download available>
pypy-3.9.19-linux-x86_64-gnu <download available>
pypy-3.8.16-linux-x86_64-gnu <download available>
pypy-3.7.13-linux-x86_64-gnu <download available>
Pythonのインストール
uvでPythonをインストールするには uv python install
- 何も指定せずにインストールすると
$HOME/.local/share/uv/python/
にインストールされる。$ uv python dir /home/user1/.local/share/uv/python $ uv python install 3.13 Installed Python 3.13.2 in 5.36s + cpython-3.13.2-linux-x86_64-gnu $ uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu .local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13
- パッチバージョンを指定してのインストールも可能。
$ uv python install 3.13.0 Installed Python 3.13.0 in 2.16s + cpython-3.13.0-linux-x86_64-gnu $ uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu .local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 cpython-3.13.0-linux-x86_64-gnu .local/share/uv/python/cpython-3.13.0-linux-x86_64-gnu/bin/python3.13
- 環境変数 UV_PYTHON_INSTALL_DIR で指定するとそのディレクトリにインストールしてくれる。
$ UV_PYTHON_INSTALL_DIR=/opt/uv-python/ uv python dir /opt/uv-python/ $ sudo UV_PYTHON_INSTALL_DIR=/opt/uv-python/ uv python install 3.13 Installed Python 3.13.2 in 2.10s + cpython-3.13.2-linux-x86_64-gnu $ ls /opt/uv-python/ cpython-3.12.5-linux-x86_64-gnu
- -i や –install-dir オプションでインストール先の指定も可能。
$ sudo uv python install 3.13.0 -i /opt/uv-python/ Installed Python 3.13.0 in 3.29s + cpython-3.13.0-linux-x86_64-gnu $ ls /opt/uv-python/ cpython-3.13.0-linux-x86_64-gnu cpython-3.13.2-linux-x86_64-gnu
uv python uninstall
削除する場合は uv python uninstall
- パッチバージョンを省略すると全てが対象になるっぽい。
$ uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu .local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 cpython-3.13.0-linux-x86_64-gnu .local/share/uv/python/cpython-3.13.0-linux-x86_64-gnu/bin/python3.13 $ uv python uninstall 3.13 Searching for Python versions matching: Python 3.13 Uninstalled 2 versions in 260ms - cpython-3.13.0-linux-x86_64-gnu - cpython-3.13.2-linux-x86_64-gnu $ uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu <download available>
- もちろんパッチバージョンを指定してのアンインストールも可能。
$ uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu .local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 cpython-3.13.0-linux-x86_64-gnu .local/share/uv/python/cpython-3.13.0-linux-x86_64-gnu/bin/python3.13 $ uv python uninstall 3.13.0 Searching for Python versions matching: Python 3.13.0 Uninstalled Python 3.13.0 in 131ms - cpython-3.13.0-linux-x86_64-gnu $ uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu .local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13
- インストール先を変えている場合は環境変数で指定する
$ UV_PYTHON_INSTALL_DIR=/opt/uv-python/ uv python ls | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 cpython-3.13.0-linux-x86_64-gnu /opt/uv-python/cpython-3.13.0-linux-x86_64-gnu/bin/python3.13 $ sudo UV_PYTHON_INSTALL_DIR=/opt/uv-python/ uv python uninstall 3.13 Searching for Python versions matching: Python 3.13 Uninstalled 2 versions in 231ms - cpython-3.13.0-linux-x86_64-gnu - cpython-3.13.2-linux-x86_64-gnu $ UV_PYTHON_INSTALL_DIR=/opt/uv-python/ uv python ls | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu <download available>
任意のディレクトリにインストールしたPythonを使えるようにする
- デフォルトの場所か、PATHの通った場所か、UV_PYTHON_INSTALL_DIRで指定した場所から探してくるようで、そのままでは表示されない。
$ uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu <download available>
- 表示させるにはパスの通った場所にシンボリックリンクを張るとか、
$ sudo ln -s /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 /usr/local/bin/ $ uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu /usr/local/bin/python3.13 -> /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 cpython-3.13.2-linux-x86_64-gnu <download available>
- 環境変数で指定すれば表示されるけど…
$ UV_PYTHON_INSTALL_DIR=/opt/uv-python uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 cpython-3.13.0-linux-x86_64-gnu /opt/uv-python/cpython-3.13.0-linux-x86_64-gnu/bin/python3.13
- alternatives がお勧め
- python3 はOS標準のpython3.11のままに、alternativesでパッチバージョンを切り替えられるようにするといいかも。
(切り替える必要性があるかは分からないけど…)$ which python3 /usr/bin/python3 $ ls -l /usr/bin/python3* lrwxrwxrwx 1 root root 10 4月 9 2023 /usr/bin/python3 -> python3.11 -rwxr-xr-x 1 root root 6839896 12月 1 06:22 /usr/bin/python3.11
- 確認、まだない
$ update-alternatives --get-selections | grep python $ update-alternatives --query python3.13 update-alternatives: エラー: python3.13 の alternatives がありません
- 追加
$ sudo update-alternatives --install /usr/local/bin/python3.13 python3.13 /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 2 update-alternatives: /usr/local/bin/python3.13 (python3.13) を提供するために自動モードで /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 を使います $ sudo update-alternatives --install /usr/local/bin/python3.13 python3.13 /opt/uv-python/cpython-3.13.0-linux-x86_64-gnu/bin/python3.13 0 update-alternatives: /usr/local/bin/python3.13 (python3.13) を提供するために自動モードで /opt/uv-python/cpython-3.13.0-linux-x86_64-gnu/bin/python3.13 を使います
- 追加後の確認
$ update-alternatives --get-selections | grep python python3.13 auto /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 $ update-alternatives --query python3.13 Name: python3.13 Link: /usr/local/bin/python3.13 Status: auto Best: /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 Value: /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 Alternative: /opt/uv-python/cpython-3.13.0-linux-x86_64-gnu/bin/python3.13 Priority: 0 Alternative: /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 Priority: 2
- 表示されるようになった
$ uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu /usr/local/bin/python3.13 -> /etc/alternatives/python3.13 cpython-3.13.2-linux-x86_64-gnu <download available>
- 切り替えてみる
$ sudo update-alternatives --config python3.13 alternative python3.13 (/usr/local/bin/python3.13 を提供) には 2 個の選択肢があります。 選択肢 パス 優先度 状態 ------------------------------------------------------------ * 0 /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 2 自動モ ード 1 /opt/uv-python/cpython-3.13.0-linux-x86_64-gnu/bin/python3.13 0 手動モ ード 2 /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 2 手動モ ード 現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 1 update-alternatives: /usr/local/bin/python3.13 (python3.13) を提供するためにマニュアルモード で /opt/uv-python/cpython-3.13.0-linux-x86_64-gnu/bin/python3.13 を使います $ uv python list | grep 3.13 cpython-3.13.2+freethreaded-linux-x86_64-gnu <download available> cpython-3.13.2-linux-x86_64-gnu <download available> cpython-3.13.0-linux-x86_64-gnu /usr/local/bin/python3.13 -> /etc/ alternatives/python3.13
- python3 はOS標準のpython3.11のままに、alternativesでパッチバージョンを切り替えられるようにするといいかも。
OpenSSLのバージョンを調べる
OS付属のPython 3.11はaptインストールしたlibssl3の3.0.14を使っている。
$ python3.11 -c 'import ssl; print(ssl.OPENSSL_VERSION)'
OpenSSL 3.0.14 4 Jun 2024
$ dpkg -l libssl3 | grep 3.0
ii libssl3:amd64 3.0.14-1~deb12u2 amd64 Secure Sockets Layer toolkit - shared libraries
実際のファイルは /usr/lib/x86_64-linux-gnu/libssl.so.3
$ python3.11 -c 'import ssl; import time; time.sleep(2)' & lsof -p $!
[1] 2279
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python3.1 2279 nissy cwd DIR 8,1 4096 262149 /home/nissy
python3.1 2279 nissy rtd DIR 8,1 4096 2 /
python3.1 2279 nissy txt REG 8,1 6839896 809726 /usr/bin/python3.11
python3.1 2279 nissy mem REG 8,1 4730136 790788 /usr/lib/x86_64-linux-gnu/libcrypto.so.3
python3.1 2279 nissy mem REG 8,1 688160 790789 /usr/lib/x86_64-linux-gnu/libssl.so.3
python3.1 2279 nissy mem REG 8,1 212272 809658 /usr/lib/python3.11/lib-dynload/_ssl.cpython-311-x86_64-linux-gnu.so
python3.1 2279 nissy mem REG 8,1 27028 802451 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
python3.1 2279 nissy mem REG 8,1 1176160 792941 /usr/lib/locale/locale-archive
python3.1 2279 nissy mem REG 8,1 1922136 787742 /usr/lib/x86_64-linux-gnu/libc.so.6
python3.1 2279 nissy mem REG 8,1 174176 794824 /usr/lib/x86_64-linux-gnu/libexpat.so.1.8.10
python3.1 2279 nissy mem REG 8,1 121280 788617 /usr/lib/x86_64-linux-gnu/libz.so.1.2.13
python3.1 2279 nissy mem REG 8,1 911904 787745 /usr/lib/x86_64-linux-gnu/libm.so.6
python3.1 2279 nissy mem REG 8,1 215000 787738 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
python3.1 2279 nissy 0u CHR 136,0 0t0 3 /dev/pts/0
python3.1 2279 nissy 1u CHR 136,0 0t0 3 /dev/pts/0
python3.1 2279 nissy 2u CHR 136,0 0t0 3 /dev/pts/0
uvでインストールしたPythonはOpenSSLのバージョンが異なる。
$ uv python find
/usr/local/bin/python3.13
$ $(uv python find) --version
Python 3.13.2
$ $(uv python find) -c 'import ssl; print(ssl.OPENSSL_VERSION)'
OpenSSL 3.0.16 11 Feb 2025
uvのpythonではlibssl.so.3が見つからないけど libpython3.13.so.1.0
のサイズがやけに大きい。
$ $(uv python find) -c 'import ssl; import time; time.sleep(1)' & lsof -p $!
[1] 2259
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python3.1 2259 nissy cwd DIR 8,1 4096 262149 /home/nissy
python3.1 2259 nissy rtd DIR 8,1 4096 2 /
python3.1 2259 nissy txt REG 8,1 2126816 1835768 /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13
python3.1 2259 nissy mem REG 8,1 1176160 792941 /usr/lib/locale/locale-archive
python3.1 2259 nissy mem REG 8,1 1922136 787742 /usr/lib/x86_64-linux-gnu/libc.so.6
python3.1 2259 nissy mem REG 8,1 911904 787745 /usr/lib/x86_64-linux-gnu/libm.so.6
python3.1 2259 nissy mem REG 8,1 38178488 1836214 /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/lib/libpython3.13.so.1.0
python3.1 2259 nissy mem REG 8,1 27028 802451 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
python3.1 2259 nissy mem REG 8,1 14640 787760 /usr/lib/x86_64-linux-gnu/librt.so.1
python3.1 2259 nissy mem REG 8,1 14480 787762 /usr/lib/x86_64-linux-gnu/libutil.so.1
python3.1 2259 nissy mem REG 8,1 14480 787744 /usr/lib/x86_64-linux-gnu/libdl.so.2
python3.1 2259 nissy mem REG 8,1 14480 787757 /usr/lib/x86_64-linux-gnu/libpthread.so.0
python3.1 2259 nissy mem REG 8,1 215000 787738 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
python3.1 2259 nissy 0u CHR 136,0 0t0 3 /dev/pts/0
python3.1 2259 nissy 1u CHR 136,0 0t0 3 /dev/pts/0
python3.1 2259 nissy 2u CHR 136,0 0t0 3 /dev/pts/0
python3.1 2259 nissy 3r REG 0,19 4096 2722 /sys/kernel/mm/transparent_hugepage/enabled
libpython3.13.so.1.0
にOpenSSLも含まれているっぽい。
$ strings /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/lib/libpython3.13.so.1.0 | grep '^OpenSSL 3'
OpenSSL 3.0.16 11 Feb 2025
Python 3.11と3.12でも確認、都度更新してくれるようだ、ありがたい。
$ strings /opt/uv-python/cpython-3.12.9-linux-x86_64-gnu/lib/libpython3.12.so.1.0 | grep '^OpenSSL 3'
OpenSSL 3.0.16 11 Feb 2025
$ strings /opt/uv-python/cpython-3.11.11-linux-x86_64-gnu/lib/libpython3.11.so.1.0 | grep '^OpenSSL 3'
OpenSSL 3.0.16 11 Feb 2025
※ 最小セットアップしたDebian 12には strings
コマンドは存在しない。
binutils
パッケージに入っている。