ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Mac彻底卸载Anaconda3指南:清理conda与残留配置

Mac彻底卸载Anaconda3指南:清理conda与残留配置 前两周有个以前同事给我发来一张终端截图每次打开 iTerm 都停在(base)环境conda --version还能正常输出版本号但他明明早就把 Anaconda3 从“应用程序”里拖进废纸篓了。这种“卸载之后阴魂不散”的情况我在 Mac 上处理过太多次基本每次都会遇到。原因很简单Anaconda3 在 macOS 上的安装方式和普通 App 完全不一样它不是一个 .app 包而是往系统里老老实实塞了一套目录、配置文件、环境变量、可能还有 LaunchAgent不把这几层都拆干净就等于只拔了电源线但没拆主板。这篇文章我就把“安全、干净、不误伤系统”的卸载路线完整写一遍。1. 先搞清楚为什么 Anaconda 会“卸不干净”1.1 一个让人很头大的卸载场景很多人的“卸载”动作是这样的打开应用程序目录找到 Anaconda-Navigator把它拖进废纸篓然后清空废纸篓。结果下一次打开终端依然能看到(base)前缀甚至conda list还能列出包。问题出在三个地方Anaconda-Navigator 只是一个图形入口真正的代码和运行时在/opt/anaconda3、~/anaconda3或~/opt/anaconda3这类目录里。安装时 Anaconda 会调用conda init在你的 shell 配置文件里写入一整段初始化代码每次开终端都会自动加载 conda。除了主目录还有~/.conda、~/.condarc、~/Library/Application Support下的配置文件、缓存在盘上。所以判断“卸载干净”的标准应该是一套组合终端不再自动进入 base 环境、which conda没有任何输出、PATH 里看不到 anaconda 路径、磁盘上找不到残留目录或残留配置。1.2 conda 在你的 Mac 上到底放了哪些东西网上很多卸载教程只会告诉你“删掉 /opt/anaconda3 就完事了”这种说法既不够准确也有风险。想安全卸载先得知道它在哪里动了手脚。以最常见的安装方式为例Anaconda3 在 Mac 上的文件分布大概是这几类类型典型路径说明主安装目录/opt/anaconda3、~/anaconda3、~/opt/anaconda3、/usr/local/anaconda3几千个文件包含 Python 解释器、conda、包缓存、envsshell 配置~/.zshrc、~/.bash_profile、~/.bashrc、~/.profileconda init 注入的初始化代码和 export PATH用户配置~/.condarc、~/.conda、~/.continuumconda 通道、环境历史、缓存索引图形程序/Applications/Anaconda-Navigator.app图形界面入口拖进废纸篓不解决根问题桌面服务/后台进程~/Library/LaunchAgents下的旧版 plist旧版本可能有后台守护进程Jupyter / 编辑器配置~/.jupyter、VSCode 的 interpreter 设置kernelspec 和解释器路径可能指向 Anaconda Python看到这个分布你就明白了只删主目录是不行的因为下次开终端~/.zshrc里的初始化代码还会去找/opt/anaconda3/bin/conda找不到就会报错VSCode 里如果选了 Anaconda 的 Python 作为解释器也会一直提示解释器失效。1.3 三种安装方式对应三套卸载路线Mac 上安装 Anaconda3 的方式常见有三种卸载思路不完全一样。官方图形安装器pkg / dmg 安装主目录通常在/opt/anaconda3安装较老版本也可能在~/anaconda3。这种方式最麻烦因为它会同时写入/opt、/Applications和 shell 配置。命令行 bash 脚本安装在终端执行bash Anaconda3-xxx-MacOSX-x86_64.sh装进去的默认装到~/anaconda3或~/opt/anaconda3。卸载时基本不用 sudo权限在自己用户目录下。Homebrew Cask 安装通过brew install --cask anaconda装的实际文件在/opt/homebrew/Caskroom/anaconda3Apple Silicon或/usr/local/Caskroom/anaconda3Intel卸载应该优先用brew uninstall --cask anaconda直接rm -rf反而会让 brew 一头雾水。提示卸载前一定要先确认自己的安装方式。我就见过有人用rm -rf删了/opt/anaconda3结果发现其实是 Homebrew 装的brew list里还挂着一个 broken 的 anaconda后面每次执行 brew 命令都会报错。2. 动手之前先备份、再断环境2.1 导出环境和包列表别让项目毁在半路我见过太多人卸载 Anaconda 之前不看自己 base 环境里装了什么等删完才发现某个项目需要的numpy、pandas、matplotlib全没了又去手动装一遍。虽然正常卸载不会动你项目的源代码但项目依赖的 Python 环境一定会失效。所以在删除之前至少做三件事# 记录当前所有 conda 环境 conda env list # 备份当前环境假设你主要在 base 开发 conda env export -n base base-environment.yml # 记录当前环境通过 pip 安装的包 conda run -n base pip freeze base-pip-requirements.txt如果你有多个自定义环境最好这样跑一遍for env_name in $(conda env list | awk NR2 $1!# {print $1}); do conda env export -n $env_name $env_name-environment.yml done这样以后想重装 Anaconda 或者迁移到 Miniconda拿着 yml 文件执行conda env create -f xxx.yml就能把环境恢复回来不用靠记忆。2.2 识别当前 Python 解释器和运行中的进程有一个细节很多人会忽略你的终端python指向的到底是 Anaconda 的 Python还是系统自带的 Python。这个直接决定了卸载后你有没有“后路”。which -a python python3正常输入这个命令后会有类似输出/opt/anaconda3/bin/python /usr/bin/python3前面的/opt/anaconda3/bin/python就是 Anaconda 的后面/usr/bin/python3是 macOS 自带的。卸载 Anaconda 不会动系统自带的/usr/bin/python3所以你不用担心“删了之后系统 Python 就没了”。同时检查一下当前有没有正在使用 Anaconda Python 的进程。比较稳妥的做法是ps aux | grep -i anaconda | grep -v grep如果有明显的 anaconda 或 conda 相关进程可以先用条件匹配的方式结束尽量不要把范围扩大到“python”关键字因为系统里可能有别的 Python 进程pgrep -fl anaconda|/opt/anaconda3|conda确认进程列表后再决定是否 kill不要让卸载半路出现“目录被占用”的问题。2.3 关闭会自动加载 conda 的终端会话如果你现在开着 iTerm 或 Terminal并且处于 conda 环境里建议先把当前环境退出再继续后续操作conda deactivate conda config --set auto_activate_base false第二步尤其重要因为如果你不关掉auto_activate_base每开一个新终端都会自动激活 base导致后续某些操作会以为自己还在 Anaconda 环境里。设置成 false 之后重新打开终端会看不到(base)前缀但 conda 命令仍然可用此时再做卸载更安全。3. 核心拆除按安装方式删掉 Anaconda 主体3.1 用官方 uninstall 脚本和 Anaconda-Clean 的组合网上很多教程都会推荐直接rm -rf但如果你用的是官方 pkg 安装我建议先看看 Anaconda 自己有没有带卸载脚本。一般路径是ls /opt/anaconda3/uninstall* 2/dev/null ls /opt/anaconda3/bin/conda 2/dev/null如果能看到uninstall-MacOSX-x86_64.sh或者uninstall.sh直接执行/opt/anaconda3/uninstall-MacOSX-x86_64.sh脚本跑完之后Anaconda 主目录里的大部分内容会被清掉但 shell 配置里的初始化代码、部分缓存文件不会被清理所以还要配合后面的手动步骤。另外一个实用工具是 Anaconda-Clean它是官方维护的一个清理小工具能把你散落在用户目录下的 conda 配置文件、环境文件备份到一个目录中。它需要在你还没卸载 Anaconda 的时候安装conda install -n base -c conda-forge anaconda-clean anaconda-clean --yes执行完之后~/.condarc、~/.conda、~/.continuum等文件会被搬到一个备份目录比如~/.anaconda_backup/2024-XX-XX。这个工具的好处是比较稳它是先备份再清理万一你后面后悔了还能从备份目录恢复。3.2 手动删除安装目录时的完整路径清单如果 Anaconda 没有提供卸载脚本或者你已经 Homebrew 卸载完但残留了主目录那就只能手动删。我把手动删除时需要确认的路径全部列出来/opt/anaconda3~/anaconda3~/opt/anaconda3/usr/local/anaconda3/Applications/Anaconda-Navigator.app~/Applications/Anaconda-Navigator.app删除之前先确认目录是否存在避免把不相关的东西也一起删了for p in /opt/anaconda3 ~/anaconda3 ~/opt/anaconda3 /usr/local/anaconda3 /Applications/Anaconda-Navigator.app ~/Applications/Anaconda-Navigator.app; do [ -e $p ] echo 存在: $p done确认之后如果路径在/opt或/usr/local往往需要 sudo如果都在用户目录下~/开头直接rm -rf ~/anaconda3 ~/opt/anaconda3需要注意没有确认路径之前绝对不要执行大范围的sudo rm -rf。有一个真实的踩坑案例是有人执行sudo rm -rf /opt/*想清掉 Anaconda结果把其他软件也删了这台机器后面完全没法正常编译只能重装系统。3.3 用 Homebrew 安装的怎么处理Homebrew 装的 Anaconda我的建议是永远先走brew uninstallbrew uninstall --cask anaconda因为 Homebrew 在安装时已经记录了文件清单用它卸载会走一套“按清单删文件”的逻辑能避免残留一堆 Caskroom 里的零碎文件。卸完后再检查一下 Caskroom 目录ls /opt/homebrew/Caskroom/anaconda3 2/dev/null ls /usr/local/Caskroom/anaconda3 2/dev/null如果有残留目录但brew list --cask已经不显示 anaconda 了再手动删掉对应 Caskroom 目录也不迟。之后建议跑一次brew doctor看看 Homebrew 自己有没有报告异常。4. 清除 shell 配置里的 conda 初始化代码和 PATH4.1 conda init 到底在 .zshrc 里写了什么这是卸载 Anaconda 时最容易被忽略、又最影响日常使用的一步。只要.zshrc里还留着 conda 的初始化代码你开终端时就会出现两种情况如果 Anaconda 目录已经被删掉终端报错比如command not found: conda或者parse error near ()之类。如果 Anaconda 目录还在终端又会自动激活(base)哪怕你以为已经卸载了。在上面提到的场景里.zshrc文件一般长这样# conda initialize # !! Contents within this block are managed by conda init !! __conda_setup$(/opt/anaconda3/bin/conda shell.zsh hook 2 /dev/null) if [ $? -eq 0 ]; then eval $__conda_setup else if [ -f /opt/anaconda3/etc/profile.d/conda.sh ]; then . /opt/anaconda3/etc/profile.d/conda.sh else export PATH/opt/anaconda3/bin:$PATH fi fi unset __conda_setup # conda initialize 这段代码就是“打开终端自动进 (base)”的元凶。卸载时要把从# conda initialize 到# conda initialize 的所有内容删掉同时也要把文件顶部可能存在的export PATH/opt/anaconda3/bin:$PATH删掉。4.2 手动删除配置段的实操示例我常用的方式是先备份再编辑cp ~/.zshrc ~/.zshrc.bak-before-anaconda-uninstall然后用vim或nano打开定位到 conda 相关段落手动删除。如果你确认文件格式比较规整也可以用 sed 批量删掉# 删除从 conda initialize 开始到结束的所有行 sed -i /# conda initialize /,/# conda initialize /d ~/.zshrc执行完 sed 之后强烈建议重新打开文件检查一下因为有些人的.zshrc里 PATH 不是写在 conda 初始化模块里而是单独一行比如export PATH/opt/anaconda3/bin:$PATH这行 sed 也删不掉得手动处理。检查完成后执行source ~/.zshrc如果正常的话终端提示符前面不会再出现(base)echo $PATH里也找不到 anaconda 的路径。4.3 其他 shell 如 bash、fish 的清理注意点虽然从 macOS Catalina 开始默认 shell 是 zsh但仍然有很多用户切到了 bash 或者 fish。如果你平时用的是 bash那要检查这 4 个文件~/.bash_profile~/.bashrc~/.profile/etc/paths.d/里可能的 anaconda 路径文件特别是~/.bash_profilemacOS 下 bash 登录 shell 通常会读它Anaconda 的 init 代码经常写在这里面。删除方式和.zshrc一样。如果用的是 fish检查ls ~/.config/fish/conf.d/里面可能有conda.fish之类的配置。需要执行conda init --reverse这个命令可以自动移除 conda 在 shell 配置中写入的初始化代码。不过如果主目录已经被删掉了conda命令本身不可用那就只能手动删除 fish 配置目录下的 conda 相关文件。5. 深度扫尾配置残留、缓存、LaunchAgent 和第三方应用引用5.1 好用的搜索命令与典型残留位置完成主体删除和 shell 配置清理后Anaconda 基本“不可用”了但离“干净”还差一截。为了排查残留我一般会用下面这几条命令# 在用户目录找名字带 anaconda 的文件/目录 find ~ -maxdepth 5 -iname *anaconda* 2/dev/null # 在系统目录找需要配合 sudo sudo find /opt /usr/local /Library -maxdepth 4 -iname *anaconda* 2/dev/null # 使用 macOS 自带的 Spotlight 索引搜索 mdfind -name anaconda | head -50搜索结果里最常见的几个残留位置~/.condaconda 的用户配置目录里面可能有 environments.txt、环境索引。~/.condarcconda 的配置文件包含 channels、channels_alias、ssl_verify 等设置。~/.continuumcontinuum analytics 的历史遗留文件旧版 Anaconda 会创建。~/Library/Caches下和 anaconda 相关的缓存目录。~/Library/Logs下可能存在的 anaconda 日志。如果是自己用户目录下的这些文件删除前记得看一眼因为里面可能有你手动配置的 channel 信息。如果你确认不再需要 Anaconda可以删掉rm -rf ~/.conda ~/.continuum rm -f ~/.condarc如果还想保留可以改名备份mv ~/.condarc ~/.condarc.bak-$(date %Y%m%d)5.2 Jupyter kernelspec 和 VSCode 解释器指向Anaconda 用户基本都会用 JupyterJupyter 的 kernelspec 里记录了 Python 内核的实际路径。卸载后如果不清理打开 Jupyter 时会出现一个“幽灵 kernel”点进去就报 kernel error。你可以先运行jupyter kernelspec list如果输出里看到类似/opt/anaconda3/share/jupyter/kernels/python3或/Users/xxx/anaconda3/share/jupyter/kernels/python3这种路径就说明有指向 Anaconda 的 kernel。删除方式jupyter kernelspec uninstall -y python3不过这里有个坑如果你系统里只有一个 Python 环境把 python3 kernel 卸载后Jupyter 里可能就没有可用的 Python 内核了。更稳妥的做法是先安装好一个新的 Python 环境比如系统 Python 配python3 -m ipykernel install --user再卸载旧 kernel避免 Jupyter 直接变成空的。VSCode 用户也需要检查右下角或命令面板里的 Python 解释器。卸载后 VSCode 如果还指向/opt/anaconda3/bin/python运行 Python 文件时会有两个表现要么报“找不到 Python 解释器”要么自动降级到默认 Python但原有依赖包都不在导致ModuleNotFoundError。处理方法是在 VSCode 里按CtrlShiftPMac 上是CmdShiftP打开命令面板运行Python: Select Interpreter重新选一个可用的解释器然后重开项目窗口。5.3 LaunchAgent 与后台进程新版 Anaconda 在 macOS 上默认不创建开机启动项但旧版本或者某些特殊安装方式会在~/Library/LaunchAgents或/Library/LaunchAgents里放一个 plist 文件名字类似com.anaconda.agent.plist、com.continuum...plist。检查方式ls ~/Library/LaunchAgents/ | grep -i -E anaconda|continuum ls /Library/LaunchAgents/ | grep -i -E anaconda|continuum如果找到了相关 plist 文件并且它还在运行可以先用launchctl移除launchctl unload -w ~/Library/LaunchAgents/com.anaconda.xxx.plist然后删掉文件rm -f ~/Library/LaunchAgents/com.anaconda.xxx.plist再跑一次launchctl list | grep -i anaconda确认没有任何 conda 相关服务。这里的经验是不要一上来就杀进程先看进程对应的可执行文件路径是不是 Anaconda 安装目录里的避免误伤系统进程或其他 Python 应用。6. 验证卸载成果如何判断这台机器真的“干净”了6.1 4 条必须跑一遍的验证命令所有删除动作完成后我习惯用下面 4 条命令做终验# 1. 检查 conda 命令是否还存在 which conda command -v conda # 2. 检查 PATH 里有没有 anaconda 路径 echo $PATH | tr : \n | grep -i anaconda # 3. 检查 shell 配置文件里有没有 conda 残留 grep -n -i conda\|anaconda ~/.zshrc ~/.bash_profile 2/dev/null # 4. 检查常见残留目录 ls -ld /opt/anaconda3 ~/anaconda3 ~/opt/anaconda3 ~/.conda ~/.condarc 2/dev/null理想状态下这些命令的输出应该是which conda没有任何返回值echo $PATH里没有 anaconda 相关路径grep没有任何命中常见目录都不存在。之后再新开一个终端窗口确认提示符前不再自动出现(base)。6.2 验证时容易误判的情况需要注意两种“看起来干净但实际不干净”的情况。第一which python可能还指向 Anaconda 的路径但which conda已经查不到了。这种情况常见于 PATH 里只写了export PATH/opt/anaconda3/bin:$PATH而 conda 初始化代码被删掉了。检查方式还是which -a python python3把 Anaconda 路径从 shell 配置里清掉后再试。第二~/.bash_profile可能没有记录 conda但如果 zsh 和 bash 混用会出现“一个壳干净另一个壳还带残留”的情况。所以验证时不要只检查当前默认 shell最好把几个常见配置一起 grep。6.3 如果发现漏网之鱼该怎么补删如果验证后发现某个配置文件里还残留conda init代码直接用编辑器删对应行如果发现/opt/anaconda3还有残留目录但不确定是谁创建的先用ls -la /opt/anaconda3看一下内容和权限再决定是否需要删除。如果主目录已经删了但mdfind还是能搜索到文件名可能是 Spotlight 索引没更新可以不管过段时间它会自动消失也可以手动执行sudo mdutil -E /重建索引不过一般没必要而且重建索引费时间。7. 卸载之后重装、换 Miniconda、还是回到系统 Python7.1 完全重装 Anaconda 的推荐流程有些人是“卸载重装”因为旧版本有环境损坏或者安装目录权限乱了。这种情况下我强烈建议不要在旧目录上覆盖安装先把老目录清干净# 确认前序完全卸载完毕 which conda # 应无输出 ls /opt/anaconda3 2/dev/null # 应无输出然后从官方渠道下载最新安装包用 pkg 安装即可。安装完以后第一件事建议先设置 conda 不自动激活 baseconda config --set auto_activate_base false这样终端不会一开就进入(base)需要的时候再单独conda activate对日常工作干扰最小。7.2 想轻量化的话Miniconda 和 venv 怎么选如果卸载 Anaconda 是因为它太臃肿我一般会建议换成 Miniconda 或者直接用系统 Python 加 venv这完全取决于你要做什么。如果你深度依赖 conda 管理环境、需要通过 conda 安装非 Python 的二进制库比如某些 C/C 库装 Miniconda 最合适它体积小但用法和 conda 命令完全一样。如果你只是写普通 Python 脚本、Django/Flask 项目系统自带的/usr/bin/python3配合python3 -m venv就够了不需要再引入 conda 的依赖。这里有一个常见误区卸载 Anaconda 之后如果你之前一直是用 base 环境里的 Python 直接跑项目的那么系统 Python 里其实没有你的第三方包需要重新用 pip 安装。还好我们在卸载前导出了requirements.txt这时候直接python3 -m pip install -r base-pip-requirements.txt就能把常用依赖恢复过来。7.3 个人经验小结我在 Mac 上帮人处理过的 Anaconda2/Anaconda3 卸载至少两位数了最深的体会是卸载本身不难难在“你永远不知道当时安装时选了哪个安装器、往哪些目录写了哪些文件”。所以每次动手前我都会要求自己先跑一遍检查命令把安装方式、主目录位置、shell 配置里的改动全列出来再动手。另外清理时多留一步备份总没错。比如~/.zshrc、~/.condarc这些文件改之前复制一份值不了几 MB但万一后面后悔想恢复就不用凭记忆重新写配置了。至于官方自带的uninstall脚本和anaconda-clean能用的场景下我基本都会先用它们虽然不能照顾到 100% 的残留但至少能把大多数常见位置清干净剩下的人工补刀压力就小很多。
返回列表