[Python] Mac M1 x86 環境建置

使用 m1 開發 python 專案時,有時會需要分享給非 m1 的成員使用,或是打包成跨平台程式時會遇到相容性的問題。本篇說明如何在 m1 透過 rosetta 模擬 x86_64 的環境。

Overview

  1. Install Rosetta
  2. Install Homebrew (x86)
  3. Install Pyenv + Virtualenv (x86)

1. Install Rosetta

softwareupdate --install-rosetta

裝完之後在 Terminal 或 iTerm 按右鍵 => 取得資訊
可以看到 “使用 Rosetta 打開” 的選項,勾起來就會模擬 x86 環境
筆者是直接複製一個 iTerm,把這個選項打勾,並重新命名為 iTerm_Rosetta

2. Install Homebrew (x86)

在原本安裝 Homebrew 指令前方加上 arch -x86_64
即可安裝 x86 版本的 Homebrew

arch -x86_64 /bin/bash -c '$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)'

裝完之後,可以用 which -a 來查看目前的安裝的 Homebrew 路徑

which -a brew

# /usr/local/bin/brew => x86
# /opt/homebrew/bin/brew => arm

接著需要新增 x86 版的 Homebrew alias 到 ~/.zshrc 裡,後續才能區隔使用
常見命名有 xbrewbrew86,看喜歡哪一種覺得好記就好

alias xbrew='arch -x86_64 /usr/local/bin/brew'

3. Install Pyenv + Virtualenv + Python (x86)

利用 x86 版的 Homebrew 安裝 pyenv 和 virtualenv

xbrew install pyenv pyenv-virtualenv

接著我們在 .zshrc 下加入以下指令
當使用 Rosetta 開啟 iTerm 時,初始化相對應的 pyenv 和 virtual env
同時將 x86 下的 pyenv 與 library 指向正確的路徑,就不用再新增一個叫 xpyenv 的 alias

# =============================================================================
#                                   Rosetta
# =============================================================================
if [ $(arch) = "i386" ]; then
    eval "$(/usr/local/bin/brew shellenv)"
    alias xpyenv="arch -x86_64 pyenv"
    export PYENV_ROOT=~/.pyenv-i386
    export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl@1.1/lib/
else
    eval "$(/opt/homebrew/bin/brew shellenv)"
    export LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/opt/openssl/lib/
fi

if command -v pyenv 1>/dev/null 2>&1; then
    if [ $(arch) = "i386" ]; then
        export PATH="$HOME/.pyenv-i386/bin:$PATH"
        eval "$(xpyenv init -)"
        eval "$(xpyenv virtualenv-init -)"
    else
        export PATH="$HOME/.pyenv/bin:$PATH"
        eval "$(pyenv init -)"
        eval "$(pyenv virtualenv-init -)"
    fi
fi

改完後記得下 source 指令或開新的 Terminal
再透過 which 檢查一下 python 和 pyenv 的 Location
./pyenv-i386 下就代表目前環境是 x86 了

source ~/.zshrc

which python
# /Users/UserName/.pyenv-i386/shims/python

pyenv which pip
# /Users/UserName/.pyenv-i386/versions/3.9.15/bin/pip

設定完這些只要開啟 Rosetta 的 iTerm
就可以跟平常一樣順順地使用了

發佈留言