techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Macのzshでpyenvが「command not found: pyenv」

PythonをMacにインストールする際にHomebrew+pyenvで開発環境を整えようとした時に「command not found: pyenv」と表示され正しくバージョンの切り替えができなかったのでその内容をまとめました。

Homebrewのpyenvのインストール

pyenvはPythonのバージョンマネージャで、複数のバージョンをインストールしフォルダごとや環境全体のPythonのバージョンを管理することができるものになります。
Pythonは2系と3系が大きくことなっているということもあって入れていて重宝すると思います。
また各環境ごとの設定を切り替えることができるvirtualenvというツールもHomebrewでまとめてインストールできます。
そのコマンドが次のようになります。

$ brew install pyenv-virtualenv

インストールできたらBashの場合は.bash_profileに下記の内容を記載します。

export PYENV_ROOT=${HOME}/.pyenv
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
    eval "$(pyenv virtualenv-init -)"
fi

zshで「command not found: pyenv」

export PYENV_ROOT=${HOME}/.pyenv
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
    eval "$(pyenv virtualenv-init -)"
fi

上記の内容を「.zshenv」に記載した状態で起動すると下記のような警告がでました。

command not found: pyenv

困ったことに警告が出ている状態でpyenvは動作します。
例えばpyenvにPythonの特定のバージョンをインストールする下記のコマンドを実施した場合正しく動きます。

$ pyenv install 3.5.1

しかし、pyenvの設定で環境全体で利用するPythonのバージョンを設定するコマンドを実施した場合にバージョンが変わりません。

$ pyenv global 3.5.1  
$ python --version
Python 2.7.10

この環境では2.7.10の環境になってしまっているのでpyenvが機能していない状態になります。 pyenvのglobal設定を読み込むことができるようにするコマンドが先の処理内の「eval "$(pyenv init -)"」が正しく動作していないためです。

そのためそのままターミナルで下記を実行すると下記のような結果が得られ正しく動作します。

$ eval "$(pyenv init -)"
$ python --version
Python 3.5.1  

原因は処理順だとわかったので見なおしたところ.zshenvに読み込みの処理を記載したことが原因でした。
.zshrcに読み込み処理を記載することで「command not found: pyenv」が出なくなり、global設定が正しく読み込まれています。

理由としては.zshrc は Zsh のインタラクティブシェル(ユーザーがコマンドを入力する画面)が起動した際に読み込まれる設定ファイルでこの時点ではpyenvのパスを読み込んでいないようなので注意しましょう。