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 --install
if 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/brew
arm
會安裝在 /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 python3
arch -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/python@3.11/libexec/bin
x86
的 Python3
已經順利被安裝在 /usr/local/bin/python3
切換
這邊我先假設各位也有在 arm
的 Homebrew
安裝了一次 Python3
所以現在系統上並存了同樣版本,但架構不同的 Python3
arm
:/opt/homebrew/bin/python3
x86
:/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
裡
覺得還是把它分享出來
希望可以幫助到有需要的人