😵

pyenv で install した python バージョンに切り替えられない

2021/08/20に公開

半人日分の足踏み集大成

事象

会社から支給されたMacbookにて環境構築中に発生した出来事。
pyenv local で install した python version に切り替えても何故か python の PATH が書き換わらなかった。
あれれと思い pyenv versions でみると正しくアサインされている。

$ pyenv local 3.9.5
$ pyenv versions
  system
* 3.9.5 (set by /path/to/project/.python-version)
$ python --version
Python 2.7.16

よくよく調べると pyenv の sims ディレクトリが空っぽだ。[1]

$ ls ~/.anyenv/envs/pyenv/shims/
$

普段ならここに実行ファイルが置かれるはずなのに…
よくある pyenv init --path し忘れかと思ったが .zshrc に記載があることは確認済み。
謎。

tl;dr

  • bash のバージョンが古かったのでバージョンアップしたら直った

環境

  • MacBookPro 2020, macOS Catalina 10.15.X
  • anyenv 1.1.4 (関係なし)
  • pyenv 2.0.4-12-g3738c2a2
  • bash 3.2.5 <-- こいつが犯人だった

原因

インストール時にひっそりとエラーが出てた (status code が 0 だったので気づかなかった...)

$ pyenv install 3.9.5
pyenv: /Users/developer/.anyenv/envs/pyenv/versions/3.9.5 already exists
continue with installation? (y/N) y
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.9.5.tar.xz...
-> https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz
Installing Python-3.9.5...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.9.5 to /Users/developer/.anyenv/envs/pyenv/versions/3.9.5

/Users/developer/.anyenv/envs/pyenv/pyenv.d/rehash/conda.bash: line 38: conditional binary operator expected

該当のコード を読むと

  if [[ -v registered_shims[@] ]]; then
    ...

とある。 test-v って何かなと調べてみた。
どうやら変数が未定義かを判断するオプションらしい、成程。
https://qiita.com/ymdymd/items/51bf4145ec58654eaffc
どうやら bash のバージョンが古いらしく、手元端末の bash では対応していない様子。ふえぇ

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.

てか2020年モデルのMacなのにバージョン古すぎでしょこれ…
(いつのバージョンから入ったのか少し調べたけど分からなかった。気になる…けどまぁいいか。

対応

Mac だったので brew で最新バージョンを導入

$ brew info bash
bash: stable 5.1.8 (bottled), HEAD
Bourne-Again SHell, a UNIX command interpreter
https://www.gnu.org/software/bash/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/bash.rb
License: GPL-3.0-or-later
==> Options
--HEAD
        Install HEAD version
==> Analytics
install: 19,150 (30 days), 66,912 (90 days), 304,056 (365 days)
install-on-request: 16,100 (30 days), 56,321 (90 days), 258,538 (365 days)
build-error: 0 (30 days)

$ brew install bash

$ exec $SHELL -l  # 参照先を正すためにシェル再起動
$ bash --version
GNU bash, バージョン 5.1.8(1)-release (x86_64-apple-darwin19.6.0)
Copyright (C) 2020 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

あとは pyenv rehash で shims を再構築

$ pyenv rehash
Cloning into '/Users/developer/.anyenv/envs/pyenv/plugins/pyenv-virtualenv'...
remote: Enumerating objects: 2082, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 2082 (delta 6), reused 6 (delta 1), pack-reused 2064
Receiving objects: 100% (2082/2082), 590.25 KiB | 1.21 MiB/s, done.
Resolving deltas: 100% (1419/1419), done.

$ python --version
Python 3.9.5

めでたしめでたし。

脚注
  1. 参照先がanyenvなのは各人の環境で読み替えてください ↩︎

Discussion