[Python] Python on which CPU Arch x86 or arm ?
檸檬爸人生中開始使用 Apple Macbook 是在 2014 年的時候,距今也已經 10 年以上了,那時候 Macbook 的晶片架構主要是 Intel x86,一直以來都是利用 Apple 的備份工具轉換了好幾台電腦,直到去年開始使用 Apple M1 的晶片,切換到了 arm 的架構,慢慢地遇到了一些 Python 程式不能跑在 arm 架構上的問題,由於以前預設是 x86 的環境,所以自然而然 homebrew 安裝的相關程式都是 x86 的版本,例如眾多的 Python 版本,本篇紀錄如何調整 Macbook 使其能夠共存。
參考
執行指令 python3 -c ‘import platform; print(platform.processor())’ 的回傳值,i386 代表 python 執行在 x86 架構,回傳 arm 則代表 python 是在 arm 架構。 你的 Python 跑在哪一個架構上呢?
首先先確定 Homebrew 版本
一般來說最簡單的 python 安裝方式就是透過 Homebrew,所以你的 Homebrew 很大程度地影響你的 python 執行架構。
透過以下指令我們發現預設的 brew 的實際路徑與 homebrew 的版本,這邊可以清楚的觀察到舊的 homebrew 程式是 macOS:14.6-x86_64 版本,並且有啟動 Rosetta,關於 Rosetta 可以參考 Apple 官網上的解釋,他最著要的目的就是:Rosetta 2 enables a Mac with Apple silicon to use apps that were built for a Mac with an Intel processor.
% which brew
/usr/local/bin/brew
% brew config
HOMEBREW_VERSION: 4.4.21
ORIGIN: https://github.com/Homebrew/brew
HEAD: 2e57f8f794af60804dcc185d1807c6d6ca10418c
Last commit: 6 days ago
Branch: stable
Core tap JSON: 23 Feb 00:05 UTC
Core cask tap JSON: 23 Feb 00:05 UTC
HOMEBREW_PREFIX: /usr/local
HOMEBREW_REPOSITORY: /usr/local/Homebrew
HOMEBREW_CELLAR: /usr/local/Cellar
HOMEBREW_CASK_OPTS: []
HOMEBREW_MAKE_JOBS: 10
Homebrew Ruby: 3.3.7 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/3.3.7/bin/ruby
CPU: deca-core 64-bit westmere
Clang: 14.0.0 build 1400
Git: 2.31.1 => /usr/local/bin/git
Curl: 8.7.1 => /usr/bin/curl
macOS: 14.6-x86_64
CLT: 15.0.3.9.4
Xcode: 14.0.1
Rosetta 2: true
所以基本上如果你繼續使用 homebrew 安裝的所有東西,都會用 x86 的架構去編譯的,如果想要直接安裝 arm 架構編譯的 App 這時候你就要另外安裝一個 homebrew 安裝參考,此時你的電腦裡會出現兩個 homebrew 的路徑 /opt/homebrew
for Apple Silicon, /usr/local
for macOS Intel,你會觀察到兩個設定不一樣。
% /opt/homebrew/bin/brew config
HOMEBREW_VERSION: 4.4.17
ORIGIN: https://github.com/Homebrew/brew
HEAD: 55f399c10dc7e6cc07497bdfccdecc96329e3b57
Last commit: 5 weeks ago
Branch: stable
Core tap JSON: 23 Feb 00:05 UTC
Core cask tap JSON: 23 Feb 00:05 UTC
HOMEBREW_PREFIX: /opt/homebrew
HOMEBREW_CASK_OPTS: []
HOMEBREW_MAKE_JOBS: 10
Homebrew Ruby: 3.3.7 => /opt/homebrew/Library/Homebrew/vendor/portable-ruby/3.3.7/bin/ruby
CPU: deca-core 64-bit arm_firestorm_icestorm
Clang: 14.0.0 build 1400
Git: 2.37.0 => /Applications/Xcode.app/Contents/Developer/usr/bin/git
Curl: 8.7.1 => /usr/bin/curl
macOS: 14.6-arm64
CLT: 15.0.3.9.4
Xcode: 14.0.1
Rosetta 2: false
安裝 python
根據你的需要執行相對應的指令可以安裝不同架構的 Python 程式。
/usr/local/bin/brew install python@3.13
/opt/homebrew/bin/brew install python@3.13
備註:常見的 Python virtualenv 的管理套件例如:conda, pipenv 等等也必須要跟著不同的 homebrew 安裝否則創建出來的 python 環境仍然會是 homebrew 使用的架構。
設定合適的 python3 連結
當安裝好合適的 python 版本之後,記得要調整 python 等等指令的真實路徑,如下所示:我們可以因此去切換調用常用的 python3.13 在 arm 的架構之上。
% ls -l /usr/local/bin | grep python3
-rwxr-xr-x 1 admin admin 247 6 15 2023 ipython3
lrwxr-xr-x 1 admin admin 44 9 16 10:36 python3.10 -> ../Cellar/python@3.10/3.10.15/bin/python3.10
lrwxr-xr-x 1 admin admin 51 9 16 10:36 python3.10-config -> ../Cellar/python@3.10/3.10.15/bin/python3.10-config
lrwxr-xr-x 1 admin admin 44 9 16 10:37 python3.11 -> ../Cellar/python@3.11/3.11.10/bin/python3.11
lrwxr-xr-x 1 admin admin 51 9 16 10:37 python3.11-config -> ../Cellar/python@3.11/3.11.10/bin/python3.11-config
lrwxr-xr-x 1 admin admin 43 9 16 10:44 python3.12 -> ../Cellar/python@3.12/3.12.6/bin/python3.12
lrwxr-xr-x 1 admin admin 50 9 16 10:45 python3.12-config -> ../Cellar/python@3.12/3.12.6/bin/python3.12-config
lrwxr-xr-x 1 admin admin 54 1 26 15:13 python3.13 -> /opt/homebrew/Cellar/python@3.13/3.13.1/bin/python3.13
lrwxr-xr-x 1 admin admin 61 1 26 15:13 python3.13-config -> /opt/homebrew/Cellar/python@3.13/3.13.1/bin/python3.13-config
lrwxr-xr-x 1 admin admin 41 2 23 08:12 python3.7 -> ../Cellar/python@3.7/3.7.17/bin/python3.7
lrwxr-xr-x 1 admin admin 48 2 23 08:12 python3.7-config -> ../Cellar/python@3.7/3.7.17/bin/python3.7-config
lrwxr-xr-x 1 admin admin 42 2 23 08:12 python3.7m -> ../Cellar/python@3.7/3.7.17/bin/python3.7m
lrwxr-xr-x 1 admin admin 49 2 23 08:12 python3.7m-config -> ../Cellar/python@3.7/3.7.17/bin/python3.7m-config
lrwxr-xr-x 1 admin admin 41 2 23 08:12 python3.8 -> ../Cellar/python@3.8/3.8.20/bin/python3.8
lrwxr-xr-x 1 admin admin 48 2 23 08:12 python3.8-config -> ../Cellar/python@3.8/3.8.20/bin/python3.8-config
lrwxr-xr-x 1 admin admin 41 9 16 10:35 python3.9 -> ../Cellar/python@3.9/3.9.20/bin/python3.9
lrwxr-xr-x 1 admin admin 48 9 16 10:35 python3.9-config -> ../Cellar/python@3.9/3.9.20/bin/python3.9-config