Pyenv を入れた後、”command not found” で Python がインストールできない時の対処

Pyenvをセットアップ後、Pythonインストールで「python-build: command not found」となり失敗した時に行なった対処法を紹介します。
2020.05.08

Guten Tag, ベルリンより伊藤です。

Pyenv を入れて意気揚々とPythonインストールしようとしたら、次のエラーで失敗しました。

$ pyenv install 3.8.2
/usr/local/bin/pyenv-install: line 53: python-build: command not found
/usr/local/bin/pyenv-install: line 76: parse_options: command not found

このエラー事例を探しても見当たらなかったので、解決した方法をご紹介します。

環境

OS: MacOS Mojave 10.14.6

インストールまでにやったこと

Pyenvのインストール & 環境設定

pyenv のセットアップですが、複数の外部サイト(※)を参照した限り、だいたい同じだったので、次の方法で行いました。

※例えば: MacでPython使う時の最低限のメモ(pyenv編) - Qiita

  1. Pyenv をインストール
    $ brew install pyenv

  2. .bash_profile に環境設定を追加

    $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
    $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
    $ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
    

  3. 変更を反映

    $ source .bash_profile

参照した情報の限りでは、もうこの次にPythonインストールに進んでいるんですが、冒頭のエラーに引っかかり次に進めません。

状況確認

※参考に載せておきますが不要な方は読み飛ばしてください※

Pyenv自体が入っているのは確認できました。参照した情報は正しく設定できているようです。まだPyenvではPythonをインストールしていないので、Pythonは当然まだローカルのパスを参照しています。

$ pyenv -v
pyenv 1.2.18

$ pyenv versions
* system (set by /Users/mai/.pyenv/version)

$ which pyenv
/usr/local/bin/pyenv

$ cat .bash_profile | grep -i pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

$ which python
/usr/bin/python

PATHで通している場所には、ディレクトリのみが作成されていました。

$ ls -lR /Users/mai/.pyenv
total 0
drwxr-xr-x  2 mai  staff  64 May  7 13:29 shims
drwxr-xr-x  2 mai  staff  64 May  4 14:09 versions

/Users/mai/.pyenv/shims:

/Users/mai/.pyenv/versions:

which pyenv のパスを追ってみるとこのようになっていました。この辺はこれで問題ないようでした。

$ ls -la /usr/local/bin/pyenv
lrwxr-xr-x 1 mai admin 32 Apr 30 18:59 /usr/local/bin/pyenv -> ../Cellar/pyenv/1.2.18/bin/pyenv

$ ls -la /usr/local/Cellar/pyenv/1.2.18/bin/pyenv
lrwxr-xr-x 1 mai staff 16 Apr 2 21:32 /usr/local/Cellar/pyenv/1.2.18/bin/pyenv -> ../libexec/pyenv

$ ls -la /usr/local/Cellar/pyenv/1.2.18/libexec/pyenv
-rwxr-xr-x 1 mai staff 3308 Apr 30 18:59 /usr/local/Cellar/pyenv/1.2.18/libexec/pyenv

前提条件の再確認

参考にしたサイトでは触れられていませんでしたが、改めて公式のGitHubページを確認すると、「Basic GitHub Checkout」の手順3~5ができてなかったので、対応しました。

■ 3-4. pyenv init の追加 & 変更を反映

.bash_profile に既に eval "$(pyenv init -)" が含まれていましたが、公式に従うよう、既存のを消して下記で追加し直しました:

$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

$ exec "$SHELL"

■ 5. 依存するビルド環境の用意

Suggested build environment に従い、各種インストールします。

・Xcode Command Line Tools のインストール

$ xcode-select --install

・Homebrewで各種インストール(brew listで既存のモジュールを確認し、ないものだけ指定)

$ brew install openssl readline sqlite3 xz zlib

で、ここまでやっても pyenv install の結果は冒頭の通りで変わりませんでした。今回のエラーには意味なかったのかもしれませんが、推奨環境に整えたということで。

シンボリックリンクの再関連付け

手詰まりになり、社内の猛者チャンネルで上の状況を説明したところ、教えてもらった回答で治りました!
(教えていただき、ありがとうございました!!)

下記ディレクトリの中にpython-buildがありますか?
→ありました

/usr/local/Cellar/pyenv/1.2.18/bin/

もしあるのであれば、下記コマンドで再度関連づけてみてはいかがでしょうか?
→1つ追加で関連付けされたようです!

$ brew unlink pyenv && brew link pyenv
Unlinking /usr/local/Cellar/pyenv/1.2.18... 3 symlinks removed
Linking /usr/local/Cellar/pyenv/1.2.18... 4 symlinks created

そして、その後無事にエラーなくPythonインストールできるようになりました!

$ pyenv install 3.8.2

$ which python
/Users/mai/.pyenv/shims/python

$ pyenv global 3.8.2

$ pyenv versions
  system
* 3.8.2 (set by /Users/mai/.pyenv/version)

$ python -V
Python 3.8.2

結果、brew unlink pyenv && brew link pyenv でエラー解消に繋がりました。

猛者すごい...

原因はなんだったか分からないですが、実際には他の作業と並行してやっていたので何かが影響してしまったのかも...ググっても情報がなかったということは稀有な例なのかもしれませんが、トラブルシューティングにご参考くださいませ。

その後、virtualenv の入れ方・使い方は下記ブログを参考にしました!

anyenvからpyenv+virtualenvをインストールしてバージョンやパッケージを切替可能なPython環境を用意する

おまけ:Pyenv を入れるにあたり既存の Python を消すべき?

ちなみに、Pyenv を入れるまでは、ローカルの Python 2.7 を使っていたのですが、2.7 は廃止するということで Python 3.8 も入れたところでした。この時に気持ち悪いので使わないローカルの Python は消してしまおうと思ったんですが、いろいろ調べた限り、既存の Python を削除するのはあまり推奨されていないようです。

それでも消したいという意固地な方、下記のような方法でアンインストールできました。

私もインストールしたてで何にも使っていなかった 3.8 の方は消去しました。

また、この時 pip2 freeze でパッケージを確認してみたら awscli が入っており、古い Python に依存しているのがやっぱり気持ち悪かったので一度アンインストールし、Python個別のインストールの不要なAWS CLI バージョン2を入れ直しました。

$ pip uninstall awscli

$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /

$ rm AWSCLIV2.pkg

これを機に各種バージョンなど見直してはいかがでしょう。

参考

以上です!Schönen Abend!