Heavy Watal

Pythonインストール

標準・公式

MacやLinuxならシステムの一部として /usr/bin/python3 が既にインストールされているので、 何もしなくても使えっちゃ使える。 でも大概そこに入ってるのはちょっと古いバージョンなので、 python.jp/環境構築ガイド に従って最新版を入れるのがよい。

uv

https://docs.astral.sh/uv/

プロジェクトの環境構築を一切合切面倒見てくれる管理ツール。 ruffやryeと同じチームが開発していて、同じくrust製。 次のワンライナーでプログラム本体が ~/.local/bin/uv に配置される:

curl -LsSf https://astral.sh/uv/install.sh | sh

シェルの設定が書き換えられて PATH を設定してもらえる。 ドットファイルを勝手にいじられたくない人は INSTALLER_NO_MODIFY_PATH=1 を定義してから実行すれば避けられる。 現状では uv self update でも同じ処理が走ってしまうが、 それは近日中に改められるらしい

任意のバージョンのPythonを入れるためのツールとして、 つまりpyenv的な位置付けでも使える。 しかもビルド済みのPythonを https://github.com/indygreg/python-build-standalone から取ってくるので、自前ビルド環境に左右されずCPUも使わず簡単。

Pythonインストーラーとして使う

https://docs.astral.sh/uv/reference/cli/#uv-python

# バージョン一覧
uv python list

# インストール
uv python install

バージョンを省略すると適当な最新版。 3 とか 3.12 みたいな指定でもその中での最新版を入れられる。

~/.local/share/uv/python/ 以下に配置される。 uv runuv venv 越しに使う前提ならここにPATHを通す必要はない。

設定

https://docs.astral.sh/uv/configuration/environment/

設定ファイルは ~/.config/uv/ に置くらしいけど、 今のところ環境変数を使うのが主流。

ほかのツールで入れたPythonやシステム標準の /usr/bin/python まで探しに行って報告しようとしてくれる。 uv自身で入れたPythonだけに専念してもらうと少し早くなる:

export UV_PYTHON_PREFERENCE=only-managed

PEP 668 EXTERNALLY-MANAGED が有効なので uv venv で仮想環境を作って使う。

uv pip は普通のpipと比べて圧倒的に速い。

ほかにもサブコマンドがたくさん。

rye

https://rye.astral.sh/

プロジェクトの環境構築を一切合切面倒見てくれる管理ツール。 ruffやuvと同じチームが開発していて、同じくrust製。 次のワンライナーでプログラム本体や設定ファイルなどが ~/.rye/ に配置される:

curl -sSf https://rye.astral.sh/get | bash

内部的にuvを使っていて、役割がややかぶっている。 uvの開発が急速に進む一方、こちらはやや遅れてきて存在意義が揺らいできている…?

Pythonインストーラーとしてだけ使う

パッケージ運用はまだ普通にpipとかでいいかなと思う人の使い方。

# インストール済みバージョン一覧
rye toolchain list

# 利用可能バージョン一覧
rye toolchain list --include-downloadable

# インストール
rye toolchain fetch cpython@3.12

今のところグローバルに pip3 install しても怒られない。 global-python = true の設定でshimsにPATHが通っていればryeの管理下にあるPythonをプロジェクト外でも使えるが、逆に pyproject.toml が存在するディレクトリでのみそれができないという問題 #1121 がある。 shimsに頼らず自分でPATHを設定するworkaround:

if [ -d "${RYE_HOME:=${HOME}/.rye}" ]; then
  py_versions=($(ls "${RYE_HOME}/py" | sort -V))
  export PY_PREFIX=${RYE_HOME}/py/${py_versions[@]: -1}
  PATH=${PY_PREFIX}/bin:${PATH}:${RYE_HOME}/shims
  unset py_versions
fi

pyenv

https://github.com/pyenv/pyenv

管理者権限なしでホーム以下にインストールできる。 ソースコードを取ってきて自前ビルドするという点で上記uvryeと異なる。 共有ライブラリやフレームワークなどを有効にしたい場合に使いやすい。

  1. HomebrewGit を使ってpyenvをインストール:

    brew install pyenv
    # or
    git clone https://github.com/pyenv/pyenv.git ~/.pyenv
    mkdir -p ~/.pyenv/cache
    
  2. https://github.com/pyenv/pyenv/wiki を参考に依存ライブラリをインストールしておくとビルドが少し軽くなる。

  3. Pythonのインストール先を決める環境変数 PYENV_ROOT を公式推奨の ~/.pyenv に設定し、 ついでにPATHも追加しておく。 シェルの設定ファイル (e.g., ~/.bashrc) に次のように追記:

    if [ -d "${PYENV_ROOT:=${HOME}/.pyenv}" ]; then
      py_versions=($(ls "${PYENV_ROOT}/versions" | sort -V))
      export PY_PREFIX=${PYENV_ROOT}/versions/${py_versions[@]: -1}
      PATH=${PY_PREFIX}/bin:$PATH
      unset py_versions
    fi
    

    pyenv shellpyenv local を使ってPythonのバージョンを頻繁に切り替える場合は、 公式の説明どおりに eval "$(pyenv init --path)"eval "$(pyenv init -)" を設定してshimsを使う方法のほうがいいかもしれないけど、 そうでなければこのようにPATHだけ設定するほうが単純で、 起動時間も短くなる。

  4. シェルを再起動して設定を反映し、 目当てのバージョンを探してインストール:

    exec $SHELL -l
    pyenv install -l | less
    pyenv install 3.12
    exec $SHELL -l
    

    R から reticulate 越しに呼ぶ場合は共有ライブラリを有効にしてビルドする:

    env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.10
    # or
    Rscript -e 'reticulate::install_python("3.10")'
    
  5. pip のパスを確認し、パッケージを入れる:

    which pip3
    pip3 install -U setuptools pip
    pip3 install -r /path/to/requirements.txt
    

    よく使うパッケージは requirements.txt の形でまとめておくと楽。

https://github.com/pyenv/pyenv/wiki/Common-build-problems

Anaconda

Scientificな用途で使いたい場合は Numpy/Scipy などの主要パッケージもまとめて面倒みてくれる Anaconda を使うという選択肢もある。 私は使わない。 GUIのインストーラでもいいし、Homebrewでも入れられる。

ただしPATH上でシステムコマンドを上書きしちゃうヤンチャな面もあるので、 それが気になる人はpyenv越しに入れることで汚染をある程度防げる。 全部入りに抵抗がある場合は pyenv install miniconda3-latest から小さくスタートすることも可能。 パッケージ管理では pip の代わりに非公式の conda を使うことになる。

環境変数

https://docs.python.org/3/using/cmdline.html#environment-variables

シェルの設定ファイル(~/.zshrc とか)で export しておく。 一時的に無効したいときは python -E で起動。

PYTHONPATH

import の探索パス (sys.path) の先頭付近に場所を追加できる。 例えば自分で書いたモジュールやパッケージの置き場所を指定しておけば、 いつでも優先的に import できるようになる。

PYTHONUSERBASE

pip installsetup.py install における --user オプションの目的地を指定できる。 デフォルトでは ${HOME}/.local 。 MacのFramework buildでは ${HOME}/Library/Python/2.7 とかになる。

現在の設定は siteUSER_BASE で確認できる (python -m site)。 USER_SITE はその下の {BASE}/lib/python*.*/site-packages に配置され、 sys.path に含まれる。 除外したいときは PYTHONNOUSERSITE をセットするか python -s で起動。

PYTHONSTARTUP

インタラクティブモードで起動するときに読み込むファイルを指定できる。