Debianに pyenv をシステムワイドにインストール

pythonのバージョン切り替えをしたい。

調べてみたが、Pythonのバージョン切り替えやプロジェクトごとのバージョン管理はなかなか分かりづらい。 pythonそのもののバージョンを切り替えるにはpyenvを使うのが良さそう。

実際のところ、pyenvをsystem wideにインストールする必然はない。 自分の場合は、ユーザーのディレクトリに置きたくなかっただけの理由だ。

参考

pyenvのインストール

基本的にRuby版であるrbenvのインストールと同様の手順でいけるはず。(DebianにRuby 3をインストール)

最初にディレクトリを作成してgroupとpermissionを設定すれば、あとの作業はsudoを使わなくてもOK。

sudo mkdir -p /usr/local/share/pyenv
sudo chgrp -R staff pyenv
sudo chmod -R g+rwxXs pyenv
git clone https://github.com/pyenv/pyenv.git /usr/local/share/pyenv
git clone https://github.com/pyenv/pyenv-virtualenv.git /usr/local/share/pyenv/plugins/pyenv-virtualenv
環境変数の設定は以下の通り:
export PYENV_ROOT="/usr/local/share/pyenv"
export PATH="${PYENV_ROOT}/bin:${PATH}"
export PATH="${PYENV_ROOT}/shims:${PATH}"
eval "$(pyenv init - )"

/usr/local/share/pyenv/shimsのPATHを追加しているのは、これが無いとpyenvのpythonが認識されないため苦肉の策。 この対処が正しいのかは分かっていない。

環境変数を反映させる。自分はzshを使っているので .zshenvに入れている。各自の環境に合わせてね。
source .zshenv

pythonのインストール

pythonのインストールはpython環境をbuildすることと同じ意味であることに注意。 だから、構築するためのツール・ライブラリなどがないと失敗する。

というわけでdebianではbuild-dep で構築環境を一式インストールしておく:

sudo apt build-dep  python3.11

(python3.11の部分は自分のシステムのpythonのパッケージ名に合わせる。)

ここまで来るとようやくpyenvでpythonをインストールできる。

pyenvからインストールできるpythonのバージョンを知るには

pyenv install -l 

とする。

しかし、たくさんリストが出てきて困る。python本体だけを抽出するには

pyenv install -l 
pyenv install --list | grep "^ *3\.*"
 
のようにする。
pyenv install 3.8.11
pyenv local 3.8.11

確認すると下のようになる:

~% pyenv versions      
  system
* 3.8.11 (set by /home/xxxx/.python-version)

pyenvのupdate

pyenv自身にはupdateの機能はないらしい。 update は git pullすることになる。
cd /usr/local/share/pyenv
git pull