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版本了。不过我这边不使用这种方式,切终端稍微有点麻烦了,我使用的方式最后说。
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版本还是一起的,相同的版本号不能直接安装两个,这边还需要安装一个别名插件。
安装命令
$ 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"
新增了切换环境的别名:mzsh
和 xzsh
,输入别名及切换环境,而不需要切换终端。
然后配置了识别当前环境的来运行不同的 brew 和 pyenv,如果各位有其他软件需要共存两种版本,也可以配置进去;最后的xpyenv, xbrew, mpyenv, mbrew 也未删除,偶尔还能用到。
效果如图:
i386就代表在x86下运行,也就是Rosetta编译下运行。
arm就是m1下。
以上就是所有内容,希望对你有帮助,如果你有更好的方式,请一定留言,毕竟折腾这东西,很浪费时间,一度后悔换电脑。
参考资料
- 如何在 M1 macbook 上安装 python 环境 - 叩顶窝客 (koding.work)
- 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
,提供给大家参考。) - Josh’s M1 Mac Development Environment - homebrew, zsh, Ruby and python version managers | Josh Holtz