pyenv init Pythonのバージョン切替の使い方

アプリケーションによって、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)”と書くのが正解のようでした。