资讯详情

资讯详情

Mac 上 Anaconda 安装与使用全指南:环境管理与常见问题排查

1. 为什么在 Mac 上还要认真对待 Anaconda很多人在 Mac 上第一次装 Python 环境都是直接去官网下载一个 Python 安装包然后pip install一路装下去。刚开始写几个小脚本没问题等到要跑数据分析、机器学习、深度学习项目的时候麻烦就来了numpy 和 scipy 版本打架、matplotlib 中文乱码、pytorch 和 tensorflow 抢 CUDA 依赖、不同项目要求不同版本的 pandas……最后整个系统 Python 环境被搞得一团糟连pip自己都开始报错。Anaconda 在 Mac 上的价值恰恰就是解决这类“环境地狱”问题。它本质上是一个Python 发行版 包管理器 虚拟环境管理器的组合体自带 conda 命令行工具、conda-forge 社区源、以及几百个预编译好的科学计算包。你在 Mac 上装好 Anaconda 之后可以给每个项目单独建一个隔离环境环境之间互不干扰删掉环境就像删掉一个文件夹一样干净。这篇文章面向的是在 macOS 上使用 Anaconda 的开发者、数据分析初学者、以及需要管理多个 Python 项目的工程师。我会从安装、初始化、环境管理、包管理、Jupyter 使用、常见坑排查这几个角度把我在 Mac 上用了几年 Anaconda 的经验完整讲一遍。文章里涉及的命令和配置都可以直接复制到终端里跑遇到问题也可以对照后面的排查表来处理。需要提前说明一点Anaconda 在 Mac 上有两种主流安装方式一种是图形化安装包.pkg一种是命令行安装脚本.sh。两种方式各有适用场景我会在第 2 节里详细对比。另外Apple SiliconM 系列芯片和 Intel 芯片的 Mac 在安装包选择上有区别这一点很多人第一次装的时候会踩坑我也会重点讲。2. 安装前的准备与安装方式选择2.1 先搞清楚你的 Mac 是什么芯片打开终端输入下面这行命令uname -m如果输出是arm64说明你是 Apple Silicon 芯片M1、M2、M3、M4 系列。如果输出是x86_64说明你是 Intel 芯片。这个信息决定了你该下载哪个版本的安装包。为什么要区分因为 Anaconda 官方为两种架构分别提供了安装包。虽然 Apple Silicon 上可以通过 Rosetta 2 运行 Intel 版本但那样会带来性能损失而且某些科学计算库在 Rosetta 下会出现兼容性问题。所以能装原生 arm64 版本就装原生版本。另外还要确认一下 macOS 版本。Anaconda 较新的版本一般要求 macOS 11 以上如果你还在用很老的系统可能需要找历史版本。查看系统版本sw_vers2.2 图形化安装包 vs 命令行安装脚本这两种方式我都用过说一下各自的优缺点。图形化安装包.pkg的优点是双击就能装一路点“继续”适合完全不想碰命令行的新手。缺点是安装位置固定默认在/opt/anaconda3或用户目录下而且安装过程中会问你一些选项选错了后面要改比较麻烦。命令行安装脚本.sh的优点是灵活你可以自己指定安装路径安装过程透明出问题容易排查。缺点是需要用终端操作对新手稍微有点门槛。我的建议是如果你打算长期用 Anaconda直接用命令行脚本安装。因为后面你反正要频繁用终端敲 conda 命令早点熟悉终端没坏处。而且命令行安装可以避免一些图形化安装带来的权限问题。2.3 下载安装包的正确姿势去 Anaconda 官网的下载页面找到 macOS 版本。注意页面上会有两个选项一个是 “Graphical Installer”一个是 “Command Line Installer”。同时还要选架构Apple Silicon 选 arm64Intel 选 x86_64。下载完成后如果是 .sh 脚本文件通常叫类似Anaconda3-2024.xx-MacOSX-arm64.sh这样的名字。把它放到你的下载目录里。提示不要从第三方站点下载 Anaconda 安装包也不要用别人分享的“破解版”或“精简版”。Anaconda 本身个人使用是免费的官方下载最安全也避免被植入奇怪的东西。2.4 安装路径怎么选默认情况下命令行安装脚本会把 Anaconda 装到你的用户目录下比如/Users/你的用户名/anaconda3。这个路径是可以改的安装过程中会提示你确认。我个人的习惯是保持默认路径装在用户目录下。原因是这样不需要 sudo 权限后续升级、装包、删环境都不会遇到权限问题。如果你装到/opt/anaconda3这种系统目录后面很多操作都要加 sudo反而麻烦。如果你确实想装到自定义路径比如/Users/你的用户名/tools/anaconda3在安装脚本提示时输入即可。但要注意路径里不要有空格和中文否则某些工具会出问题。3. 一步步完成 Anaconda 安装与初始化3.1 用命令行脚本安装假设你下载的脚本叫Anaconda3-2024.10-MacOSX-arm64.sh放在~/Downloads目录下。打开终端依次执行cd ~/Downloads bash Anaconda3-2024.10-MacOSX-arm64.sh执行后会先显示许可协议按回车翻页翻到最后输入yes同意。然后会提示你确认安装路径直接回车用默认路径即可。接着就是解压安装这个过程大概需要几分钟取决于你的硬盘速度。安装完成后脚本会问你“Do you wish to update your shell profile to automatically initialize conda?” 这一步很关键。3.2 要不要让安装脚本自动初始化 shell如果你选yes安装脚本会自动往你的~/.zshrcmacOS 默认 shell 是 zsh里写入一段 conda 初始化代码。这样每次打开新终端conda 的 base 环境会自动激活你能直接用conda命令。如果你选no那么conda命令不会自动可用你需要手动初始化。我的建议是先选 no然后手动初始化。原因是自动写入的代码有时候会和你已有的 shell 配置冲突而且 base 环境自动激活会让终端启动变慢还会影响你系统里其他 Python 工具的行为。手动初始化可以让你更清楚地知道发生了什么。3.3 手动初始化 conda安装完成后先关闭当前终端重新打开一个新终端。然后执行~/anaconda3/bin/conda init zsh如果你用的是 bash就把zsh换成bash。执行后会提示你它修改了~/.zshrc文件。然后执行source ~/.zshrc这时候conda命令应该就可以用了。验证一下conda --version如果输出了版本号说明初始化成功。3.4 关闭 base 环境自动激活即使你初始化了 conda默认情况下每次打开终端还是会自动激活 base 环境终端提示符前面会出现(base)。如果你不喜欢这样可以执行conda config --set auto_activate_base false然后重新打开终端(base)就不会自动出现了。需要用到 conda 的时候手动conda activate base或者激活其他环境即可。注意关闭自动激活后conda命令本身还是可以用的只是不会自动进入某个环境。这一点很多人会搞混以为关了自动激活 conda 就不能用了其实不是。3.5 验证安装是否完整装完之后建议做几个基本验证conda info这个命令会输出 conda 的版本、Python 版本、base 环境路径、channel 配置等信息。重点看 “base environment” 这一行路径应该是你安装的目录。conda list这个命令会列出 base 环境里已安装的所有包。正常情况下应该有几百个包包括 numpy、pandas、jupyter 等。如果列表很短可能是安装不完整。python --version在 base 环境下这个命令应该输出 Anaconda 自带的 Python 版本。如果你关闭了自动激活需要先conda activate base再执行。4. 环境管理Anaconda 最核心的能力4.1 为什么一定要用虚拟环境我见过太多人所有项目都装在 base 环境里最后 base 环境被搞得乱七八糟。虚拟环境的核心价值是隔离每个项目一个环境项目 A 用 numpy 1.24项目 B 用 numpy 2.0互不影响。项目做完了直接删掉环境不留任何残留。在 Mac 上虚拟环境还有额外的好处某些包在 Apple Silicon 上的编译方式和 Intel 不同用独立环境可以针对不同架构做不同配置避免全局污染。4.2 创建环境的几种方式最基本的创建命令conda create -n myenv python3.11这行命令创建了一个叫myenv的环境里面装了 Python 3.11。-n后面跟环境名环境名建议用英文、数字、下划线不要用中文和空格。如果你想在创建环境的同时装一些包conda create -n myenv python3.11 numpy pandas matplotlib这样创建出来的环境直接就带上了这些包省得后面再一个个装。还有一种方式是从environment.yml文件创建环境适合团队协作或者复现别人的项目conda env create -f environment.ymlenvironment.yml文件长这样name: myenv channels: - conda-forge dependencies: - python3.11 - numpy - pandas - matplotlib - pip - pip: - some-pip-only-package这种方式的优点是环境配置可以版本化管理别人拿到你的 yml 文件就能一键复现同样的环境。4.3 激活、退出、查看、删除环境激活环境conda activate myenv激活后终端提示符前面会变成(myenv)表示你现在在这个环境里。退出环境conda deactivate查看所有环境conda env list或者conda info --envs输出会列出所有环境及其路径当前激活的环境前面会有一个星号。删除环境conda remove -n myenv --all或者conda env remove -n myenv删除环境是不可逆的环境里的所有包都会被删掉。所以删之前确认一下这个环境里没有你还需要的东西。4.4 环境命名和管理的经验环境名建议带上项目特征比如proj-nlp、proj-vision、test-pytorch。不要用env1、env2这种名字过两个月你自己都忘了哪个是哪个。另外不建议创建太多环境。有些人每个小脚本都建一个环境最后几十个环境管理起来很累。我的做法是按项目大类建环境比如“数据分析”一个环境、“深度学习”一个环境、“爬虫”一个环境。同一个大类下的不同小项目如果依赖不冲突就共用一个环境。还有一个技巧给常用环境设置别名。在~/.zshrc里加一行alias act-dsconda activate ds这样以后输入act-ds就能快速激活数据分析环境。5. 包管理conda 和 pip 怎么配合5.1 conda install 和 pip install 的区别这是新手最容易困惑的地方。简单说conda install从 conda 的 channel源里下载包这些包是预编译好的二进制包安装快依赖解析由 conda 统一处理。pip install从 PyPI 下载包有些包是源码需要本地编译依赖解析由 pip 处理。在 conda 环境里优先用 conda install。因为 conda 会统一管理环境里所有包的依赖关系避免冲突。只有当某个包 conda 源里没有时才用 pip。5.2 配置国内镜像源加速下载默认的 conda 源在国外下载速度可能很慢。可以配置国内镜像源。以配置某高校镜像源为例conda config --add channels https://mirrors.example.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.example.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes配置完成后可以用下面命令查看当前 channelconda config --show channels注意镜像源地址可能会变化配置前先确认地址是否可用。另外不要一次性加太多 channelchannel 越多conda 解析依赖越慢有时候还会因为不同 channel 的包版本冲突导致安装失败。5.3 安装、更新、卸载包安装包conda install numpy指定版本conda install numpy1.24从 conda-forge 安装conda install -c conda-forge some-package更新包conda update numpy更新环境里所有包conda update --all卸载包conda remove numpy查看某个包的信息conda list numpy5.4 pip 的正确使用方式在 conda 环境里用 pip一定要先激活环境然后确认 pip 指向的是当前环境的 pipconda activate myenv which pip输出的路径应该包含myenv。如果指向的是系统 pip 或者其他环境的 pip说明有问题。确认无误后再执行pip install some-package提示在 conda 环境里混用 conda 和 pip 时建议先用 conda 装能装的包最后再用 pip 装 conda 没有的包。不要反复交替使用 conda 和 pip 装同一个包那样容易把依赖关系搞乱。5.5 导出和复现环境导出当前环境到 yml 文件conda env export environment.yml这个文件包含了环境里所有包及其精确版本号适合精确复现。如果只想导出你手动安装的包不包含依赖conda env export --from-history environment.yml这种方式导出的文件更简洁但复现时可能会因为依赖版本变化导致细微差异。从 yml 文件复现环境conda env create -f environment.yml6. Jupyter Notebook 在 Mac 上的使用要点6.1 在 conda 环境里使用 Jupyter很多人装了 Anaconda 之后直接用 base 环境里的 Jupyter然后在 Jupyter 里!pip install装包结果装到了 base 环境里而不是你当前项目环境。正确做法是在每个需要 Jupyter 的环境里单独装 Jupyter或者把环境注册成 Jupyter kernel。推荐做法是注册 kernelconda activate myenv conda install ipykernel python -m ipykernel install --user --name myenv --display-name Python (myenv)这样在 Jupyter 的 kernel 列表里就能看到 “Python (myenv)”新建 notebook 时选这个 kernel用的就是你 myenv 环境里的 Python 和包。查看已注册的 kerneljupyter kernelspec list删除不需要的 kerneljupyter kernelspec remove myenv6.2 Jupyter 启动目录和配置文件默认情况下Jupyter 启动后显示的是你当前终端所在目录的文件。如果你想固定启动目录可以生成配置文件jupyter notebook --generate-config这会生成~/.jupyter/jupyter_notebook_config.py。编辑这个文件找到c.NotebookApp.notebook_dir这一行取消注释并设置为你想要的目录。在较新版本的 Jupyter 中配置项名称可能变成了ServerApp.root_dir具体以你安装的版本为准。6.3 中文显示和 matplotlib 配置Mac 上用 matplotlib 画图中文经常显示成方块。解决办法是在代码里指定中文字体import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Arial Unicode MS] plt.rcParams[axes.unicode_minus] FalseArial Unicode MS是 macOS 自带的字体支持中文。axes.unicode_minus设为 False 是为了让负号正常显示。如果你想全局配置可以找到 matplotlib 的配置文件路径import matplotlib print(matplotlib.matplotlib_fname())然后编辑那个文件加入上面的配置。7. 常见问题与排查技巧实录7.1 conda 命令找不到现象终端输入conda提示command not found。原因通常是 conda 没有初始化或者初始化代码没有生效。排查步骤确认 Anaconda 安装路径存在ls ~/anaconda3/bin/conda检查~/.zshrc里是否有 conda 初始化代码grep conda ~/.zshrc如果没有执行~/anaconda3/bin/conda init zsh执行source ~/.zshrc或重开终端7.2 激活环境后 Python 版本不对现象conda activate myenv之后python --version显示的版本和创建环境时指定的不一致。原因可能是环境没有真正激活或者 PATH 里有其他 Python 优先级更高。排查which python which pip echo $PATH确认which python输出的路径包含myenv。如果不是检查~/.zshrc里有没有在 conda 初始化之后又修改了 PATH。7.3 安装包时依赖冲突现象conda install报错提示 “Solving environment: failed” 或 “Found conflicts”。解决办法先尝试指定更宽松的版本conda install numpy而不是conda install numpy1.24.0尝试换 channelconda install -c conda-forge numpy创建一个全新环境而不是在旧环境里硬装使用conda install --freeze-installed避免更新已有包如果以上都不行用 mamba 替代 conda 的依赖解析器。mamba 是一个更快的 conda 替代品依赖解析能力强很多conda install -n base -c conda-forge mamba mamba install numpy7.4 Apple Silicon 上某些包装不上现象在 M 系列芯片的 Mac 上某些包conda install或pip install失败提示编译错误或架构不匹配。原因有些包还没有提供 arm64 的原生版本或者 conda 源里只有 x86_64 版本。解决办法优先从 conda-forge 安装conda-forge 对 arm64 支持较好如果 conda 没有尝试 pip 安装pip 可能会下载源码编译如果编译也失败考虑用 Rosetta 创建一个 x86_64 环境CONDA_SUBDIRosx-64 conda create -n myenv-x86 python3.11 conda activate myenv-x86 conda config --env --set subdir osx-64这样创建的环境是 x86_64 架构的通过 Rosetta 运行。性能会有损失但兼容性更好。7.5 环境占用磁盘空间太大Anaconda 环境和包缓存会占用大量磁盘空间。一个 base 环境加上几个项目环境轻松占用几十 GB。清理方法conda clean --all这个命令会清理未使用的包缓存、tar 包、索引缓存等。执行后会提示你确认输入y即可。另外定期检查环境列表删掉不再使用的环境conda env list conda remove -n old_env --all7.6 常见问题速查表问题现象可能原因解决方法conda 命令找不到未初始化 shell执行conda init zsh并 source激活环境后 python 不对PATH 顺序问题检查which python和~/.zshrc安装包依赖冲突channel 版本不匹配换 conda-forge 或用 mambaarm64 包装不上无原生 arm64 版本用 Rosetta 创建 x86_64 环境Jupyter 里装包装错地方kernel 未注册注册 ipykernel 并选对 kernel磁盘占用过大包缓存堆积conda clean --all终端启动变慢base 自动激活conda config --set auto_activate_base falsematplotlib 中文乱码字体未配置设置font.sans-serif为 Arial Unicode MS8. 我个人的一些使用习惯和踩坑体会用了几年 Anaconda有几个习惯我觉得挺有用分享出来。第一base 环境只用来管理 conda 本身不装项目包。base 环境里只保留 conda、mamba、jupyter 这些工具所有项目依赖都装在独立环境里。这样 base 环境永远干净不会因为某个项目的依赖把 base 搞崩。第二每个项目根目录放一个 environment.yml。项目开始时创建环境并导出 yml之后每次装新包都更新 yml。这样项目换电脑或者分享给别人时一键就能复现环境。第三定期清理。我大概每个月执行一次conda clean --all每季度检查一次环境列表删掉不用的环境。Mac 的硬盘空间虽然一般够用但 Anaconda 的缓存增长很快不清理的话不知不觉就占了几十 GB。第四遇到依赖问题不要硬刚。以前我遇到依赖冲突会花一两个小时尝试各种版本组合。后来发现最快的办法往往是新建一个干净环境重新装包。旧环境直接删掉省时省力。第五Apple Silicon 上优先用 conda-forge。conda-forge 对 arm64 的支持比默认源好很多很多包在默认源里没有 arm64 版本但在 conda-forge 里有。可以在~/.condarc里把 conda-forge 设为默认 channelchannels: - conda-forge - defaults最后再分享一个小技巧如果你经常需要在不同环境之间切换可以装一个conda-zsh-completion插件它能给 conda 命令提供自动补全包括环境名补全、包名补全等用起来效率高很多。安装方式是在~/.zshrc里加载插件具体可以参考该插件的文档。环境管理这件事说到底就是“保持干净、保持隔离、定期清理”这十二个字。做到这三点Mac 上的 Python 开发体验会顺畅很多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →