背景
在聊具体内容前先说下背景:苹果公司在2020年时发布了全新的基于Arm架构的M1芯片,标志着Mac进入了Arm架构时代,但是实际上这不是Apple第一次更换架构,当初Mac电脑从基于PowerPC的系统过渡到基于Intel的系统时,Apple使用Rosetta动态转换大多数基于 PowerPC的应用程序以配合基于Intel的Mac使用。现在是通过Rosetta 2的转换技术,让尚未更新到arm的Mac App可以在Apple芯片上运行。
问题
新的架构带来了一些兼容性方面的问题,比如一些实用工具、一些Python模块未适配的问题,如果本地不做一些特殊处理,就有可能会出现一些问题,所以咱们这次就聊聊我遇到的几个常见工具的共存方式。
brew
brew提供了对x86和Apple Silicon的兼容,不同类型的系统下,brew安装位置会不同,所以可以在Apple Silicon的Mac上同时安装两种架构的brew来防止出现兼容问题。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
此时在Apple Silicon的Mac上,会安装到/opt/homebrew/bin/brew
,这个就是Arm版本。
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
此时在Apple Silicon的Mac上,会安装到/usr/local/bin/brew
,这个就是x86_64版本。
后续如果要安装x86_64版本的工具,就可以直接使用/usr/local/bin/brew
如果要安装arm版本的,就可以使用/opt/homebrew/bin/brew
arch -x86_64 /usr/local/bin/brew install xxx
还可以通过别名的方式分别给两个版本的brew设置别名,方便使用,比如在~/.zshrc中增加
alias x86brew='arch -x86_64 /usr/local/bin/brew'
然后
x86brew install xxx
python
python是从3.9.0开始适配Apple Silicon Soc的,但是虽然Python适配了,有些模块可能还没适配,我是在迁移旧项目的时候遇到的问题,模块安装,经过一番研究发现可以通过安装X86_64版本的Python的方式来解决一些奇奇怪怪的问题。
安装X86版本的Python我选择的是使用Pyenv。
Pyenv安装
[可选]设置PYENV_ROOT
这里就是设置安装路径,如果不设置,默认就是安装到~/.pyenv
export PYENV_ROOT=xxx
执行安装脚本
curl https://pyenv.run | bash
修改/.bashrc或/.zshrc,增加如下内容
export PYENV_ROOT="xxx"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
完成
如果遇到 virtualenv失效的问题,可以参考下面:
安装完毕virtualenv插件后,创建虚拟环境一切正常,但是在激活时遇到了报错:
Failed to activate virtualenv.
Perhaps pyenv-virtualenv has not been loaded into your shell properly.
Please restart current shell and try again.
解决方法目前是在.zshrc中初始化pyenv时增加一个配置,在这里找到的[SOLVED] Getting “Failed to activate virtualenv” when using with pyenv 2.0.0-rc1-2-gac4de222 (cloned on 2021-05-22) · Issue #387 · pyenv/pyenv-virtualenv (github.com)[1]
eval "$(pyenv init --path)" # 这个就是增加的配置
eval "$(pyenv init -)" # 这个是正常的配置
eval "$(pyenv virtualenv-init -)" # 这个是正常的配置
安装X86_64版本Python
安装别名插件
此时我们需要一个别名插件帮助我们区分Python的X86版本,可以选择使用别名插件,比如pyenv-suffix[2],安装方法很简单
git clone https://github.com/AdrianDAlessandro/pyenv-suffix.git $(pyenv root)/plugins/pyenv-suffix
安装X86_64版本Python并设置别名
PYENV_VERSION_SUFFIX="_x86" arch -x86_64 pyenv install 3.8.12
查看效果
➜ ~ pyenv versions
system
3.8.10
3.8.12_x86
设置别名方便执行
alias x86pyenv='arch -x86_64 pyenv'
使用
需要使用x86_64版本的时候可以直接执行以下命令
x86pyenv [local/global/...] 3.8.12_x86
注:目前看下来直接使用pyenv也没遇到问题
zsh
zsh默认是在Arm下执行的,如果在默认的zsh中执行x86_64的Python可能会有问题(也可能没问题😉),此时可以直接将zsh也切换为x86_64环境
arch -x86_64 zsh
总结
目前根据我的使用情况来看,brew需要安装两个版本,pyenv只需要安装一次即可,环境配置这块主要是增加了如下内容:
alias x86zsh="arch -x86_64 zsh"
alias x86brew='arch -x86_64 /usr/local/bin/brew'
alias x86pyenv='arch -x86_64 pyenv'
需要切换到x86_64时,先执行x86zsh
,然后后续就可以正常使用x86brew
和x86pyenv
参考资料
https://towardsdatascience.com/how-to-use-manage-multiple-python-versions-on-an-apple-silicon-m1-mac-d69ee6ed0250
https://koding.work/issue-of-install-python-environment-on-m1-macbook/
https://github.com/Homebrew/brew
引用链接
[1]
SOLVED] Getting “Failed to activate virtualenv” when using with pyenv 2.0.0-rc1-2-gac4de222 (cloned on 2021-05-22) · Issue #387 · pyenv/pyenv-virtualenv (github.com): https://github.com/pyenv/pyenv-virtualenv/issues/387[2]
pyenv-suffix: https://github.com/AdrianDAlessandro/pyenv-suffix
历史文章
引用链接
[1]
SOLVED] Getting “Failed to activate virtualenv” when using with pyenv 2.0.0-rc1-2-gac4de222 (cloned on 2021-05-22) · Issue #387 · pyenv/pyenv-virtualenv (github.com): https://github.com/pyenv/pyenv-virtualenv/issues/387[2]
pyenv-suffix: https://github.com/AdrianDAlessandro/pyenv-suffix
随手分享、点赞、在看是对我们最大的支持
原文始发于微信公众号(移动安全星球):Apple Silicon MAC的Arm和X86兼容问题