[Python] 使用 pyenv 在 Mac 上安裝已經消失的 Python 2 版本
不知是何時開始,Mac 上原有的 Python 2.7 不見了,
只能使用 Python 3…
雖然強制升級 Python 3 是不錯,但偶爾會想要用 Python 2 來做些比較,
尤其是比較 bytes 和 str、unicode 等等的處理。
今天在上網時,正好又看到了 pyenv 這個東西,
它可以在系統中安裝多種 Python 版本,並且可以隨意切換,
決定就來裝裝看囉~
1. 安裝 pyenv
在 Mac 上使用 Homebrew 直接安裝:
brew install pyenv
2. 使用 pyenv 安裝新版本的 Python
執行 pyenv versions
顯示目前已安裝好的 Python 版本,
像我目前就只有系統內建的版本 (system):
$ pyenv versions * system (set by /Users/testuser/.pyenv/version)
執行 pyenv install -l
看看有什麼版本的 Python 可以安裝…
發現還蠻多的,除了一般版號 (像 2.7.18) 就是一般的 CPython 外,
還可以看到 anaconda、jython、pypy 等等:
$ pyenv install -l Available versions: 2.1.3 ...... 2.7.18 3.0.1 ...... 3.10.4 ...... anaconda-4.0.0 ...... ironpython-2.7.4 ...... jython-2.7.2 ...... pypy-5.7.1 ...... pypy2.7-7.3.9 ...... pypy3.9-7.3.9 ...... stackless-3.7.5
就來安裝它提供的 Python 2 的最終版本 2.7.18 吧:
pyenv install 2.7.18
裝好之後,收到一個提示說要修改 ~/.bash_profile,
把下面內容加到 ~/.bash_profile 的最下面,
讓 pyenv 被放在 $PATH 的最前面,
這樣 pyenv 才能控制現在要執行哪一個 Python 執行檔:
export PYENV_ROOT="$HOME/.pyenv" command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)"
再次執行 pyenv versions
,
可以發現目前已經有兩種版本可選用了:
$ pyenv versions * system (set by /Users/testuser/.pyenv/version) 2.7.18
3. 設定要使用的 Python 版本
pyenv 允許使用者設定三種環境下的 Python 版本:
- shell: 設定目前 shell 階段 (session) 裡的 Python (相當於設定環境變數 PYENV_VERSION)
- local: 設定此目錄或子目錄的 Python (會建立 .python-version 檔案)
- global: 設定全域級別的 Python (會建立 $(pyenv root)/version 檔案)
基本上,pyenv 會以 shell > local > global 的順序,
來尋找現在 “python” 要執行哪一個 Python 版本,
如果都沒找到的話,就會使用系統預設的 “system” 版本。
下面是設定目前的 shell session 要使用 Python 2.7.18:
pyenv shell 2.7.18
在同一個 shell session 跑跑看 python,果然叫起來的是 2.7.18 版本。
如果開另一個 shell session, 執行 python 就會找不到東西:
$ python --version Python 2.7.18
對我來說,平常 python3 這個指令會把 Python 3 跑起來,
所以我用 pyenv 把 2.7.18 版本設成全域級別,
這樣不管在哪個 shell session,跑 “python” 都能跑到 Python 2:
pyenv global 2.7.18
在目前的設置下,Python 2 和 Python 3 都能同時存在:
$ python --version Python 2.7.18 $ python3 --version Python 3.9.13
當然還可以把更多 Python 2 版本、甚至是把 Python 3 的版本,
也都加進 pyenv 裡面,
不過對我來說,目前已經足夠使用了,
就先試用一段時間看看囉~^^