Table of Contents
前言
到現在都還是有很多 package 還未提供 arm
筆者還是有一些套件沒辦法在安裝
需要在 Apple Silicon Mac 安裝 x86 Python3 才行
早期,都是利用 docker 開一個 x86 的 image
但有效能問題不說
跟 VScode 的整合,微軟一直一直都在 preview 版本
所以得找一個用起來比較舒服的方案
希望可以有幫助
前置條件
這邊只要確定你的 Mac 所使用的 Chip 是 Apple 開頭
如下圖

確認是 Apple Silicon 之後
也要確認 Rosetta 2 已經安裝
# 這個當然是最基本的
sudo xcode-select --installif arch -x86_64 /usr/bin/true 2>/dev/null; then
echo "Rosetta 2 is installed"
else
echo "Installing Rosetta 2..."
sudo softwareupdate --install-rosetta --agree-to-license
fi安裝 Python3
Homebrew
Homebrew installs the stuff you need that Apple (or your Linux system) didn’t.
Homebrew
這個套件管理,我想大家都不陌生
本篇還是會依賴他
沒安裝的朋友,可以先輸入以下指令安裝
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Installing homebrew...
==> Checking for `sudo` access (which may request your password)...
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew
==> The following new directories will be created:
/opt/homebrew/bin
/opt/homebrew/etc
/opt/homebrew/include
/opt/homebrew/lib
/opt/homebrew/sbin
/opt/homebrew/share
/opt/homebrew/var
/opt/homebrew/opt
/opt/homebrew/share/zsh
/opt/homebrew/share/zsh/site-functions
/opt/homebrew/var/homebrew
/opt/homebrew/var/homebrew/linked
/opt/homebrew/Cellar
/opt/homebrew/Caskroom
/opt/homebrew/Frameworks
...
...
...
==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/timhsu/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
https://docs.brew.sh能夠看到 Next steps 就成功安裝了
但!
今天主角是 x86 的 Python3
如果我們直接使用剛剛安裝 brew 跑下面的指令
arch -x86_64 brew install python3會得到下面的錯誤訊息
Error: Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!
To rerun under ARM use:
arch -arm64 brew install ...
To install under x86_64, install Homebrew into /usr/local.一開始我也摸不著頭緒
後來才知道 Homebrew 也是有分 arm 以及 x86 版本
x86 會安裝在 /usr/local/bin/brewarm 會安裝在 /opt/homebrew/bin/brew
所以得先安裝一個 x86 版本的 Homebrew
一樣在官方提供的指令前面加一下架構
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"最後安裝完,可以看一下提示的 brew 安裝位置
...
...
==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
(echo; echo 'eval "$(/usr/local/bin/brew shellenv)"') >> /Users/timhsu/.zprofile
eval "$(/usr/local/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
https://docs.brew.sh就如同剛剛說的
現在你的系統內同時存在兩套 Homebrew
分別是 arm 以及 x86
Apple Silicon Mac 安裝 x86 Python3
剛剛搞定了 x86 的 Homebrew
就直接來安裝
以下兩種都可以,看偏好選擇
eval "$(/usr/local/bin/brew shellenv)"
arch -x86_64 brew install python3arch -x86_64 /usr/local/bin/brew install python3順利安裝,結果如下
Python has been installed as
/usr/local/bin/python3
Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
/usr/local/opt/[email protected]/libexec/binx86 的 Python3 已經順利被安裝在 /usr/local/bin/python3
切換
這邊我先假設各位也有在 arm 的 Homebrew 安裝了一次 Python3
所以現在系統上並存了同樣版本,但架構不同的 Python3
arm:/opt/homebrew/bin/python3x86:/usr/local/bin/python3
要用什麼版本就把絕對路徑帶上直接使用
但這樣未免也太麻煩
這邊提供兩個方式可以切換
使用 alias
這個方式最簡單粗暴
直接編輯 .zshrc or .zprofile 都可
加入以下
alias x86_python3=/usr/local/bin/python3
alias x86_pip3=/usr/local/bin/pip3重啟 terminal
上面兩個 alias 就可以直接使用
x86_python3 --version
Python 3.11.6
x86_pip3 --version
pip 23.2.1 from /usr/local/lib/python3.11/site-packages/pip (python 3.11)但我個人不太喜歡
這樣只有 python3 是 x86
如果哪天有更多的 binary 也需要這樣安裝並使用
會出先滿天的 x86_xxx🤣
所以為了不管是 arm 或者 x86
我都只想叫做 python3
就需要進到下一個方法
自動調整 Homebrew
當我們什麼都不做直接進入 terminal 的時候
下 which python3
預設會得到下列結果
which python3
/opt/homebrew/bin/python3這個時候其實是 Homebrew 自動幫我們改了 $PATH
還記得安裝 Homebrew 最後提示我們要加入 .zshrc 的那段嗎
# arm
eval "$(/opt/homebrew/bin/brew shellenv)"
# x86
eval "$(/usr/local/bin/brew shellenv)"Homebrew 就是在這個時候去影響 $PATH
依據他自己的架構來調整
如果是 arm 就把 arm 安裝的配方露出來
如果是 x86 就把 x86 安裝的配方露出來
不同架構的 terminal
直接把 arm x86 完整的隔開
是筆者想到最簡單直接的方式
在 macOS 也很簡單做到
只要把應用程式複製一次
把新的那個命名為你喜歡的
這邊就叫做 x86_iTerm.app
然後 cmd + i,勾選 Open using Rosetta
如下圖

同時原本的 arm 也還會在

最後
我們在加一個判斷
來啟用哪一種版本的 Homebrew
筆者放在 .zprofile(會比 .zshrc 早 load)
記得要把原本安裝後的那段 eval 拿掉,只留下面這段
if [[ "$(uname -m)" == "x86_64" ]]; then
eval "$(/usr/local/bin/brew shellenv)"
elif [[ "$(uname -m)" == "arm64" ]]; then
eval "$(/opt/homebrew/bin/brew shellenv)"
fi這個時候
分別打開不同的 terminal
就可以順利的自動切換
也不用在前面加上自定義的前綴


至此
我們就得到一個在 Apple Silicon macOS
直接可以使用的 x86 python3
總結
M1 -> M1 Pro -> M2 Max
筆者從最一開始的 Apple Silicon 就用到現在
之前只寫過【Flutter】真。開發環境建置 on Apple Silicon(M1, M1 Pro, M1 Max, M1 Ultra)
本來都是安靜的躺在 Github 裡
覺得還是把它分享出來
希望可以幫助到有需要的人

