March 23, 2025

Rust製Python管理ソフトuvでPythonをインストール

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 サブコマンドについては後述

  1. -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
    
  2. alternatives確認
    $ update-alternatives --get-selections | grep python
    
  3. 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 を使います
    
  4. alternatives確認
    $ update-alternatives --get-selections | grep python
    python3.13                     auto     /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13
    
  5. 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 がお勧め
    1. 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
      
    2. 確認、まだない
      $ update-alternatives --get-selections | grep python
      $ update-alternatives --query python3.13
      update-alternatives: エラー: python3.13 の alternatives がありません
      
    3. 追加
      $ 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 を使います
      
    4. 追加後の確認
      $ 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
      
    5. 表示されるようになった
      $ 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>
      
    6. 切り替えてみる
      $ 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
      

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 パッケージに入っている。

© 2020 nissy-lab.com