最近工作筆電更換到新的 M1 macbook pro,但 arm 架構的 M1 CPU 在裝 python 環境上遇到不少坑,在這分享安裝步驟給大家,少走點彎路快樂享受 M1 效能爽感!

Rosetta 2 安裝指令

Rosetta 沒有列在 App Store 裡,官方文件表示只有在啟動 x86 應用時才會跳對話框提示安裝。但我們可以用以下指令直接強迫安裝:

$ /usr/sbin/softwareupdate --install-rosetta --agree-to-license

Homebrew 有分 arm 和 x86 的版本

arm 版的 Homebrew 用以下指令安裝,bin 路徑在 /opt/homebrew/bin/brew

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

x86 版的 Homebrew 用以下指令安裝,bin 路徑在 /usr/local/bin/brew。其中 arch -x86_64 表示後面的指令需要跑在 Rosetta 中。

$ arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

x86 和 arm 的 Homebrew bin 路徑不同,推測應該是為了讓 M1 可以共存兩種版本,官方才做路徑修改。因此我們可以用 which command 確認未來透過 Homebrew 安裝的套件是哪一種版本。

/opt/homebrew/Cellar 下 => arm
/usr/local/Cellar 下 => x86

修改 .zshrc 區分 arm 和 x86 的套件

PATH 優先尋找 arm Homebrew 安裝的套件

.zshrc 中調整 PATH 環境變數,讓系統優先尋找 arm 版套件

export PATH="/opt/homebrew/bin:$PATH"

為 x86 的 Homebrew 設定 alias

.zshrc 中增加 x86 Homebrew alias,免打落落長的指令並增加區別

alias xbrew='arch -x86_64 /usr/local/bin/brew'

安裝 arm + x86 python 開發環境

安裝 pyenv + pyenv-virtualenv

立刻來安裝 arm 版 pyenv 和 pyenv-virtualenv 吧

$ brew install pyenv pyenv-virtualenv

安裝 build python 所需套件

$ brew install gcc bzip2 libffi libxml2 libxmlsec1 openssl readline sqlite xz zlib

如果需要安裝 x86 版,將上述指令的 brew 更換成 x86 alias 的 xbrew 即可。為了區別 x86 的 pyenv,亦可在 .zshrc 中增加 alias

alias xpyenv='arch -x86_64 /usr/local/bin/pyenv'

用 pyenv 安裝 python

安裝 python 就和以往相同,如

$ pyenv install 3.8.13

詳細可參考 macOS 中 Python 版本太多如何管理?試試 pyenv 吧!

建議直接安裝 3.8.10 以上的 python 節省試錯時間,最初嘗試在 x86 環境安裝 3.6 問題一堆,耗費很多時間用各種手法還是無法成功,最後只好放棄。

安裝 python library 時遇到的錯誤

symbol not found in flat namespace ‘_ffi_prep_closure’

如果用 pip 安裝套件遇到這個錯誤,此篇討論建議重裝 libffi,步驟如下:

  1. 把 pyenv-virtualenv 產生的虛擬環境,和透過 pyenv 安裝的 python 移除掉 (兩個都要清乾淨,不能鐵齒)
  2. 跑以下指令重新安裝 libffi
gem uninstall ffi
brew reinstall libffi
export LDFLAGS="-L/usr/local/opt/libffi/lib"
export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig"
gem install ffi
  1. pyenv 重新安裝 python 並產生 virtualenv
  2. 再次安裝套件即可解決

2 to 3 invalid

此篇討論得知問題是 pip 和 setuptools 版本問題導致,使用以下指令強迫安裝指定版本即可解決

$ pip install -U pip==22.0.4
$ pip install -U setuptools==56.0.0

其他做法

這邊文章提供的思路是另外建立一個由 Rosetta 啟動的 x86 shell,後續指令預設跑在 x86 下,不用加 arch -x86_64,提供給大家參考。

延伸閱讀:macOS 中 Python 版本太多如何管理?試試 pyenv 吧!

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。