アプリケーションによって、pythonのバージョンが細かく指定されていることがあります。
でも、新しいpython入れて環境壊したくないし…というときに便利なのがpyenv。複数のpythonバージョンをお互いに干渉しあわない状態で同居しつつ、好きなバージョンに切り替えができるんですね。
Pythonのバージョン管理/pyenvのインストール
pyenv-installerを使うとかんたん。
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
.bashrcにパスを通してpyenvを初期化する処理を追加。
$ vi ~/.bashrc # ↓ファイルの一番下に3行追加 export PATH="${HOME}/.pyenv/bin:${PATH}" eval "$(pyenv init --path)" eval "$(pyenv virtualenv-init -)"
シェルを再起動&更新
$ exec $SHELL $ pyenv rehash $ pyenv update
Pythonのバージョン管理/pyenvの使い方
特定バージョンのpythonのインストール
以下のように好きなバージョンのpythonをインストール可能です。以下はpython 3.6.3をインストールする例です。
pyenv install 3.6.3
デフォルトのpythonバージョンを指定する
以下を実行すると、デフォルトのpythonバージョンを指定できます。
pyenv global 3.6.3
環境すべてのpythonのバージョンが変更されてしまうので、使用の際には注意。
ディレクトリごとにpythonのバージョンを切り替え
pyenv versionsでインストール済のバージョン一覧を確認できます。
$ pyenv versions bk copyimages.sh createexport.sh exportfile_from_input.sh font getimagefromblogdir.sh imagemojiire.py imagemojiire.sh imagemojiire.sh.org images importtxt maketitlefromh3.sh memo mizumashi_image.sh oldexport oldimages oldimport outputimages shuffle_image.sh title.txt title.txt.org wk system (set by /home/user1/.pyenv/version) 3.6.3 3.8.2
ディレクトリ移動してからpyenv localを実行すると対象ディレクトリ以下でのpythonバージョンを変更できます。
cd ~/test1 pyenv local 3.8.2
~/test1 というディレクトリ内ではpythonバージョンが3.8.2に、それ以外のディレクトリではpyenv globalで指定したバージョンのpythonが動作します。
現在のディレクトリで動作するpythonのバージョンを確認するには以下を実行します。
$ pyenv version 3.6.3 (set by /home/user1/.pyenv/version)
Pythonのバージョン管理/pyenvのエラー
エラー:pyenvで切り替わらない
Macでpyenvを使用時に「切り替わらない」という事態が発生するっぽいです。
私はおもにLinux上で使用していたので、切り替わらないという自体に出会ったことはないです。
原因は、「ネット上の古い手順に沿って設定してしまうと、切り替わらない現象が発生する」というもの。
具体的には、古いバージョンでは$PYENV_ROOT/binに関連モジュールがあったのが、$PYENV_ROOT/shimsにモジュールが移動した…というか、ディレクトリ名が変わったということみたいです。
対処方法はネットにいくつかありましたが、「正しい設定をする」ことで、フツーに切り替わるようですね。手順は、以下のページがシンプルでわかりやすかったです。
パスの設定を以下のようにすればいいだけなんですが、ここにたどりつくまでけっこう苦労するかも。
export PATH="$PYENV_ROOT/shims:$PATH"
参考)PyenvでPythonのバージョンが切り替わらないと思ったらインストール先が変わっただけだった
エラー:Command ‘python’ not found
pyenvは実行できたのに、pythonを実行しようとするとエラーになりました。
$ python Command 'python' not found, did you mean: command 'python3' from deb python3 command 'python' from deb python-is-python3
ファイルパスにpythonが見つからないのが原因でした。pyenv which pythonを実行するとpyenvで認識している個所にpythonがインストールされていました。
$ which python $ pyenv which python /home/user1/.pyenv/versions/3.6.3/bin/python
原因は、当初、.bashrcに仕込んでいたpyenv init -が原因。
eval "$(pyenv init --path)" とすべきところを eval "$(pyenv init -)" にしていた
bashを開いたときに以下の警告が出ていたんですが、なんだろうこれ…って感じでスルーしていたんですね。
WARNING: `pyenv init -` no longer sets PATH. Run `pyenv init` to see the necessary changes to make to your configuration.
なお、メッセージ(pyenv initを実行すると、あなたの環境に必要な変更がわかる…)を真に受けて実行するとこういうのが出ました。
$ pyenv init # (The below instructions are intended for common # shell setups. See the README for more guidance # if they don't apply and/or don't work for you.) # Add pyenv executable to PATH and # enable shims by adding the following # to ~/.profile: export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init --path)" # If your ~/.profile sources ~/.bashrc, # the lines need to be inserted before the part # that does that. See the README for another option. # If you have ~/.bash_profile, make sure that it # also executes the above lines -- e.g. by # copying them there or by sourcing ~/.profile # Load pyenv into the shell by adding # the following to ~/.bashrc: eval "$(pyenv init -)" # Make sure to restart your entire logon session # for changes to profile files to take effect.
うーん、.bashrcにはeval “$(pyenv init -)”を入れろって書いてあったりして話がループしている感じです。
結局、.bashrcには”$(pyenv init –path)”と書くのが正解のようでした。