在Apple Silicon Mac(M1/M2芯片)上使用conda创建Python 3.7环境时,很多开发者会遇到一个典型的错误:
bash复制conda create --name my_env python=3.7
输出错误信息:
code复制PackagesNotFoundError: The following packages are not available from current channels:
- python=3.7
这个问题的核心在于架构兼容性。Python 3.7发布于2018年,而Apple Silicon Mac直到2020年才推出。官方没有为osx-arm64平台提供预编译的Python 3.7二进制包,导致conda在默认配置下无法找到合适的安装包。
Apple Silicon Mac使用的是ARM架构(arm64/aarch64),而传统Mac和大多数服务器使用的是x86_64架构。这两种架构的主要区别在于:
Conda在查找包时遵循以下顺序:
Python解释器是平台相关的,必须使用对应架构的预编译版本。当conda在osx-arm64目录下找不到Python 3.7时,就会抛出PackagesNotFoundError。
解决这个问题的核心思路是让conda使用x86_64架构的包。具体有以下几种方法:
bash复制# 设置当前会话使用x86_64架构
export CONDA_SUBDIR=osx-64
# 创建环境
conda create -n py37 python=3.7 -c conda-forge
# 激活环境后永久设置架构
conda activate py37
conda config --env --set subdir osx-64
bash复制# 优先使用conda-forge通道
conda config --add channels conda-forge
conda config --set channel_priority strict
# 创建环境时显式指定架构
CONDA_SUBDIR=osx-64 conda create -n py37 python=3.7
bash复制softwareupdate --install-rosetta
成功创建环境后,应该进行以下验证:
bash复制# 检查Python版本
python --version
# 应显示: Python 3.7.x
# 检查平台信息
conda info
# 在输出中应看到platform: osx-64
Conda使用subdir参数来确定目标平台。在Apple Silicon Mac上,默认的subdir是osx-arm64。当我们将它改为osx-64时,conda会:
conda-forge通道相比默认通道有以下优势:
现象:Python程序运行明显比原生ARM版本慢
原因:通过Rosetta 2转译执行x86代码有性能损失
解决方案:
现象:安装某些包时出现冲突
解决方案:
bash复制# 尝试明确指定所有依赖版本
conda install package=version --channel conda-forge
# 或者创建新环境专门用于该包
现象:conda activate命令无效
解决方案:
bash复制# 初始化conda
conda init zsh # 或bash,根据你的shell类型
# 重新加载shell配置
source ~/.zshrc
bash复制conda install -n base -c conda-forge mamba
mamba create -n py37 python=3.7
Mamba使用C++重写了依赖解析器,速度比conda快很多。
bash复制conda create -n py38 python=3.8
bash复制conda clean --all
如果Python 3.7不是硬性要求,考虑以下替代方案:
bash复制docker run -it python:3.7
可以在容器中运行x86版本的Python,不影响主机环境。
bash复制brew install pyenv
pyenv install 3.7.12
bash复制# 下载Python 3.7源码
wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tar.xz
tar xf Python-3.7.12.tar.xz
cd Python-3.7.12
# 配置和编译
./configure --enable-optimizations
make -j8
sudo make altinstall
yaml复制name: py37
channels:
- conda-forge
dependencies:
- python=3.7
- numpy
- pandas
subdir: osx-64
bash复制conda update --all
bash复制conda env export > environment_backup.yml
在实际项目中,我通常会为每个Python版本创建基准环境,然后基于这些基准环境创建项目特定的环境。这种方法既保持了灵活性,又避免了重复解决相同的问题。对于必须使用Python 3.7的项目,建议在项目文档中明确说明环境配置方法,避免团队成员遇到同样的问题。