最近工作筆電更換到新的 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,步驟如下:
- 把 pyenv-virtualenv 產生的虛擬環境,和透過 pyenv 安裝的 python
移除掉
(兩個都要清乾淨,不能鐵齒) - 跑以下指令重新安裝 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
- pyenv 重新安裝 python 並產生 virtualenv
- 再次安裝套件即可解決
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 吧!