LoginSignup
6
5

More than 1 year has passed since last update.

pyenvを使うけど ~/.pyenv/shims にはPATHを通さないというアプローチ

Posted at

複数のPythonインタープリタをマシンにインストールするにはpyenvを使うのが一般的です。

  • ~/.pyenv/versions 以下に各バージョンのインタープリタを配置してくれる
  • ~/.pyenv/shims に置かれた python, python3, python3.10 などといった名前のスクリプトが実際のインタープリタを起動してくれる
  • どのインタープリタが選択されるかはpyenvの設定でコントロールされる。(pyenv globalpyenv local コマンドで制御)
  • だから、 ~/.pyenv/shims にPATHを通しておけばよい。この通りに自分でPATH追加してもいいし、 eval "$(pyenv init --path)" と書いてもよい。

という立て付けですね。
ただこの仕組み、1番目のところ以外は微妙というか余計ですよね、というのがいろんなプロジェクトでPython使ってきての所感です。

  • pyenv localはまず使うことがない。localでインタープリタバージョンを設定するくらいなら、普通は仮想環境を作ります。
  • pyenv globalはストレスフル。そりゃあそうです。global、マシン全体に影響を及ぼすんだから、「ああっ、あっちの仕事でやった設定変更がこっちのスクリプトの動作に!」ってストレスが必ず生じます。よって、使いません。
  • じゃあ、~/.pyenv/shims にPATH通す意味ないじゃん!

素のPythonインタープリタを使うのは結局のところ、仮想環境を作るときだけです。(小物の自分用便利スクリプトを書くときにも、あらかじめ「小物の自分用」仮想環境を作っておいてそれにshebangを張る)
ならば、python3.9 コマンドがいつでもPyhton3.9インタープリタを、 python3.10 コマンドがいつでもPython3.10インタープリタを呼び出してくれさえすれば十分となります。 python3.10 -m venv さえいつでも呼べればよい。

じゃあこれでいいじゃんと。(前提: ~/bin にはPATHが通してある。小物の自分用便利スクリプト置き場。)

ln -s ~/.pyenv/versions/3.9.10/bin/python3.9 ~/bin/python3.9
ln -s ~/.pyenv/versions/3.10.2/bin/python3.10 ~/bin/python3.10

別解としては、aliasコマンドを .zshrc / .bash_profile に書くという手もあります。

alias python3.9="$HOME/.pyenv/versions/3.9.10/bin/python3.9"
alias python3.10="$HOME/.pyenv/versions/3.10.2/bin/python3.10"

SYMLINK方式とalias方式とでは、仮想環境を作ったときの仮想環境のでき方がちょっとだけ異なります。
(SYMLINK方式だと仮想環境の python3.10 は ~/bin/python3.10 へのSYMLINKとなり、本物のインタープリタへは2段リンクとなる)

チーム内の環境構築手順書は書きやすい

このような独自のやり方をやっても、そうでない人との間で環境構築手順の差異はこれといって生じません。
環境構築手順書にはただ

前提:python3.10 コマンドでPython3.10インタープリタが呼び出せる状態になっていること。

と書いておけばよいのです。ふつーのpyenvの使い方をしている人はここで pyenv global 3.10.2 などと打つだけ、そして自分は何もせずにここを通過するだけですから。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5