目录

Mac M1 Pyenv安装Python奇技淫巧

M1芯片最低版本支持Python 3.9,但是目前需要3.7及以下的环境。

目前有些Python老版本也更新了支持M1,但是就算Python支持了M1,但好多包都不支持M1,所以还是只有使用x86版本的Python。

瞬间好像吐槽苹果,甚至后悔换电脑。

在网上找了一下资料,还是准备搞ARM(M1)和X86(Intel)并存的过渡方案,怎么搞呢?用X86版本就只有在 Rosetta 编译后再运行了。

首先就是Homebrew,还是要安装一个x86的版本,好多软件都不支持M1。

安装Homebrew

Homebrew 有分 arm 和 x86 的版本

arm 版的 Homebrew 用以下指令安装,bin 路径在 /opt/homebrew/bin/brew

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

x86 版的 Homebrew 用以下指令安装,bin 路径在 /usr/local/bin/brew。其中 arch -x86_64 表示后面的指令需要跑在 Rosetta 中。

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

其中 arch -x86_64 表示后面的指令需要跑在 Rosetta 中,还有一种方式就是直接复制一个终端程序【参考资料2】,将复制出来的终端程序使用Rosetta 打开,在新的终端中运行命令,就默认是x86版本了。不过我这边不使用这种方式,切终端稍微有点麻烦了,我使用的方式最后说。

Mac M1 Pyenv安装Python奇技淫巧

Mac M1 Pyenv安装Python奇技淫巧

x86 和 arm 的 Homebrew bin 路径不同,推测应该是为了让 M1 可以共存两种版本,官方才做路径修改。因此我们可以用 which command 确认未来透过 Homebrew 安装的套件是哪一种版本。

/opt/homebrew/ 下 => arm
/usr/local/ 下 => x86

修改 .zshrc 区分 arm 和 x86 的套件

PATH 优先寻找 arm Homebrew 安装的套件

.zshrc 中调整 PATH 环境变数,让系统优先寻找 arm 版套件

export PATH="/opt/homebrew/bin:$PATH"

为 x86 的 Homebrew 设定 alias

.zshrc 中增加 x86 Homebrew alias,免打长指令并增加区别

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

安装 arm + x86 python 开发环境

安装 pyenv + pyenv-virtualenv

pyenv的使用详细可参考 pyenv的安装和简单使用 git、pyenv、pyenv-virtualenv

立刻来安装 arm 版 pyenv 和 pyenv-virtualenv 吧

$ brew install pyenv pyenv-virtualenv

安装 build python 所需套件

$ brew install gcc bzip2 libffi libxml2 libxmlsec1 openssl readline sqlite xz zlib

如果需要安装 x86 版,将上述指令的 brew 更换成 x86 alias 的 xbrew 即可。为了区别 x86 的 pyenv,亦可在 .zshrc 中增加 alias

$ xbrew install pyenv pyenv-virtualenv
$ xbrew install gcc bzip2 libffi libxml2 libxmlsec1 openssl readline sqlite xz zlib

.zshrc 中增加 x86 xpyenv alias

alias xpyenv='arch -x86_64 /usr/local/bin/pyenv'

用 pyenv 安装 python

安装 python 就和以往相同,如

$ pyenv install 3.7.9

上面直接安装时M1版本的Python,那么怎么安装X86版本的Python呢?

机灵的朋友肯定想到,直接

$ xpyenv install 3.7.9

No No,pyenv虽然是已经是两个版本,但管理的python版本还是一起的,相同的版本号不能直接安装两个,这边还需要安装一个别名插件。

s1341/pyenv-alias: pyenv plugin to allow you to install python versions with user-specified 'aliases'. (github.com)

安装命令

$ git clone https://github.com/s1341/pyenv-alias.git $(pyenv root)/plugins/pyenv-alias

安装完成后,使用插件安装X86版本Python 3.7.9,版本取名为 3.7.9_x86

$ VERSION_ALIAS="3.7.9_x86" pyenv install 3.7.9

查看以后版本就会发现有两个版本了:

$ pyenv versions
  system
  3.7.9
  3.7.9_x86

这样我们就可以在需要x86版本Python运行的项目中,使用 3.7.9_x86 来创建对应虚拟环境来进行使用了。

再也没有奇奇怪怪的报错,舒服了!

优化

我们给x86版本的工具设置别名后(xpyenv,mpyenv),虽然感觉使用挺方便,但是我们的终端还是 ARM 下运行的,就算设置了 arch -x86_64 指定了x86版本运行,但有些工具验证环境还是会将当前环境识别成ARM,所以,我稍微优化了一下环境配置,大家可以参考。

在默认环境变量配置不变的情况下,新增以下内容:

.zshrc 配置文件

# switch arch zsh
alias mzsh="arch -arm64 zsh"
alias xzsh="arch -x86_64 zsh"

if [ "$(uname -p)" = "i386" ]; then
  echo "Running in i386 mode (Rosetta)"
  eval "$(/usr/local/bin/brew shellenv)"
  alias brew='arch -x86_64 /usr/local/bin/brew'
  alias pyenv='arch -x86_64 /usr/local/bin/pyenv'
else
  echo "Running in ARM mode (M1)"
  eval "$(/opt/homebrew/bin/brew shellenv)"
  alias brew='/opt/homebrew/bin/brew'
  alias pyenv='$HOME/.pyenv/bin/pyenv'
fi

# x86版本
alias xpyenv='arch -x86_64 /usr/local/bin/pyenv'
alias xbrew="/usr/local/bin/brew"

# arm版本
alias mpyenv='$HOME/.pyenv/bin/pyenv'
alias mbrew="/opt/homebrew/bin/brew"

新增了切换环境的别名:mzshxzsh,输入别名及切换环境,而不需要切换终端。

然后配置了识别当前环境的来运行不同的 brew 和 pyenv,如果各位有其他软件需要共存两种版本,也可以配置进去;最后的xpyenv, xbrew, mpyenv, mbrew 也未删除,偶尔还能用到。

效果如图:

Mac M1 Pyenv安装Python奇技淫巧

i386就代表在x86下运行,也就是Rosetta编译下运行。

arm就是m1下。

以上就是所有内容,希望对你有帮助,如果你有更好的方式,请一定留言,毕竟折腾这东西,很浪费时间,一度后悔换电脑。

参考资料

  1. 如何在 M1 macbook 上安装 python 环境 - 叩顶窝客 (koding.work)

  2. How to Manage Multiple Python Versions on an Apple Silicon M1 Mac | by Danny Cunningham | Towards Data Science (另外建立一个由 Rosetta 启动的 x86 shell,后续指令预设跑在 x86 下,不用加 arch -x86_64,提供给大家参考。)

  3. Josh’s M1 Mac Development Environment - homebrew, zsh, Ruby and python version managers | Josh Holtz