【macOS】在 M 系列 Mac 安裝 x86 Python3-06

Apple Silicon Mac 安裝 x86 Python3

前言

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

前置條件

這邊只要確定你的 Mac 所使用的 Chip 是 Apple 開頭
如下圖

about macOS

確認是 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 就成功安裝了

但!
今天主角是 x86Python3
如果我們直接使用剛剛安裝 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

剛剛搞定了 x86Homebrew
就直接來安裝
以下兩種都可以,看偏好選擇

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/[email protected]/libexec/bin

x86Python3 已經順利被安裝在 /usr/local/bin/python3

切換

這邊我先假設各位也有在 armHomebrew 安裝了一次 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)

但我個人不太喜歡
這樣只有 python3x86
如果哪天有更多的 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
如下圖

Apple Silicon Mac 安裝 x86 Python3 - x86 iterm

同時原本的 arm 也還會在

Apple Silicon Mac 安裝 x86 Python3 - arm iterm

最後
我們在加一個判斷
來啟用哪一種版本的 Homebrew
筆者放在 .zprofile(會比 .zshrcload
記得要把原本安裝後的那段 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
就可以順利的自動切換
也不用在前面加上自定義的前綴

x86 python3
arm python3

至此
我們就得到一個在 Apple Silicon macOS
直接可以使用的 x86 python3

總結

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


毛毛

可愛宅宅工程師、內容創作者
興趣是寫東東、寫東東跟寫東東。

Follow @Chindada Sponsor

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *