/

優雅的在 macOS 上使用 Python

為什要要這樣做?

我們都知道 macOS 有 Python,為了不將預設的環境弄髒。比較推薦的做法是透過 pyenv 這套 Python 版本管理工具來安裝不同的 Python 版本,如此一來要切換不同的版本也方便,畢竟還是有很多專案是用 Python2 在維護。

如果你沒有使用不同的 Python 版本需求也可以無視這篇,但是建議至少用 virtualenv 來開發專案,才不會把內建的 Python 環境弄成一團亂。

檢查目前版本

目前我的 macOS 的 Python 是預設的 Python:

which python

1
/usr/bin/python

python

1
2
3
4
5
6
7
8
9
WARNING: Python 2.7 is not recommended.
This version is included in macOS for compatibility with legacy software.
Future versions of macOS will not include Python 2.7.
Instead, it is recommended that you transition to using 'python3' from within Terminal.

Python 2.7.16 (default, Nov 9 2019, 05:55:08)
[GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.32.4) (-macos10.15-objc-s on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

用 pyenv 來管理 Python 版本

首先,先安裝 pyenv:

brew install pyenv

安裝完畢後確認自己的環境變數:

echo $PATH

1
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

初始設定設定

~/.zshrc 請自行替換成你的 shell 的設定檔位置(bash 的話是 ~/.bash_profile):

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

重新載入 shell:

source ~/.zshrc

重新確認環境變數:

echo $PATH

1
/Users/yiyuchang/.pyenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

可以發現家目錄下多了一個 .pyenv/shims 管理這些套件,這也是 pyenv 進行神秘魔法的地方 🧙‍♂️

開始使用 pyenv

確認目前 Python 版本為系統版本:

pyenv global

1
system

顯示可取用的 Python 版本
pyenv install --list

1
2
3
4
5
6
7
8
9
10
11
12
Available versions:
2.1.3
2.2.3
2.3.7
2.4.0
2.4.1
(略)
stackless-3.4-dev
stackless-3.4.1
stackless-3.4.2
stackless-3.4.7
stackless-3.5.4

裡面有各式各樣的 Python interpreter,在這邊,我想使用官方的 3.8.1 版本,先進行安裝:

pyenv install 3.8.1

1
2
3
4
5
6
7
8
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.1.tar.xz...
-> https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tar.xz
Installing Python-3.8.1...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.8.1 to /Users/yiyuchang/.pyenv/versions/3.8.1

查看目前本地端所有的 Python 版本(有星號代表目前正在使用):

pyenv versions

1
2
* system (set by /Users/yiyuchang/.pyenv/version)
3.8.1

將 Python 切換到剛才下載的 3.8.1:

pyenv global 3.8.1
pyenv versions

1
2
  system
* 3.8.1 (set by /Users/yiyuchang/.pyenv/version)

切換不一定要使用 global, global 代表全域的 Python 版本,另外兩種方式local 或是 shell 有興趣的朋友可以去了解一下,可以更彈性的進行 Python 版本管理

接著確認 Python 是不是真的切換到我們剛才下載的 3.8.1 了:

which python

1
/Users/yiyuchang/.pyenv/shims/python

python

1
2
3
4
Python 3.8.1 (default, Jan 11 2020, 12:25:19)
[Clang 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

大功告成!如此一來之後就可以輕鬆地在不同專案下使用 Python 了。不過建議在不同專案還是要使用 virtualenv 來管理,否則套件全部會裝在本機的全域的 Python 環境上,如果不同專案要用到不同版本的套件,又會變得一團糟!