1. 镜像源变天这件事,到底影响了谁
2026年8月9日,清华开源镜像站正式下线了 Anaconda 的软件源镜像。这个消息在数据科学和 Python 开发圈子里炸开了锅,因为过去五六年里,绝大多数国内开发者装完 Anaconda 或 Miniconda 之后做的第一件事,就是把 conda 的默认源换成清华源,然后享受飞一般的下载速度。现在这条路走不通了,很多人打开终端准备 conda install 的时候,发现要么报 404,要么卡在 Solving environment 转圈转到天荒地老。
我自己也是重度 conda 用户,手头维护着好几个不同 Python 版本的项目环境,从 3.9 到 3.12 都有。清华源停掉 Anaconda 镜像的当天晚上,我正好要给一个新项目建环境,结果 conda create -n zotero-pdf2zh-server python=3.12 这条命令跑了快二十分钟还没结束,最后直接超时。那一刻我就知道,Plan B 必须马上启用。
这篇文章就是把我这几天折腾出来的完整替代方案分享出来。不管你是刚接触 conda 的新手,还是用了好几年的老手,只要你的工作流依赖 conda 装包,这篇内容都能帮你把环境重新跑起来。我会从镜像源的选择逻辑讲起,到具体配置命令,再到 PowerShell 下的各种坑,最后给出一套可以直接抄作业的完整方案。核心关键词就几个:清华源、Anaconda、Conda、镜像、PowerShell,围绕它们把整个替代链路讲透。
先说结论:清华源停掉 Anaconda 镜像,不等于 conda 没法用了,只是需要换一条路。目前可用的替代方案主要有三类——换用其他国内镜像源、改用 conda-forge 社区源配合镜像、以及彻底转向 pip + PyPI 镜像的组合拳。这三条路各有适用场景,我下面会逐一拆解。
2. 为什么清华源要停掉 Anaconda 镜像
2.1 商业授权与镜像站运营的现实矛盾
很多人第一反应是“清华源怎么突然不干了”,其实这件事早有征兆。Anaconda 公司对它的软件仓库(repo.anaconda.com)有明确的商业使用条款,默认源里的很多包只授权给个人和小型团队免费使用,企业规模超过 200 人就需要购买商业授权。镜像站把整个仓库同步过来对外提供下载服务,本质上是在帮 Anaconda 分发它的商业产品,这在授权层面一直是个灰色地带。
清华镜像站作为国内最知名的开源镜像服务之一,运营成本主要靠学校和教育网支撑,它没有义务也没有立场去承担这种商业授权风险。所以停掉 Anaconda 镜像,从运营角度看是必然选择。这不是技术问题,是合规问题。
理解这一点很重要,因为它决定了你的 Plan B 不能只是“换个镜像站继续白嫖 Anaconda 官方源”,而是要真正理解 conda 的包来源结构,找到可持续的替代路径。
2.2 conda 的包来源到底分几层
要搞懂替代方案,先得搞清楚 conda 装包的时候到底从哪里拿东西。conda 的包来源可以分成几个层次:
defaults 源:也就是 Anaconda 官方维护的仓库,包括 repo.anaconda.com/pkgs/main 和 pkgs/r 等。这是清华源之前镜像的对象,也是授权限制最严格的部分。
conda-forge 源:这是社区驱动的开源包仓库,完全免费,包的数量和更新速度甚至超过 defaults。它不受 Anaconda 商业授权限制,是当前最推荐的替代方向。
其他第三方源:比如 bioconda、pytorch 官方源等,针对特定领域。
pip/PyPI 源:Python 生态的另一套包管理体系,和 conda 并行,很多包两边都有。
清华源停掉的是第一类 defaults 源的镜像。conda-forge 的镜像其实还在,只是很多人之前配置的时候把两者混在一起了,没注意到区别。这就给了我们操作空间。
2.3 停服后的典型报错长什么样
在讲解决方案之前,先帮你确认一下你遇到的是不是同一个问题。清华源停掉 Anaconda 镜像后,常见的报错有这么几种:
第一种是直接 404:
BASH
复制
1
CondaHTTPError: HTTP 404 NOT FOUND for url
第二种是卡在 solving environment 不动,最后超时:
BASH
复制
1
Collecting package metadata (repodata.json): failed
2
CondaError: KeyboardInterrupt
第三种是 PowerShell 下激活环境时报初始化错误:
BASH
复制
1
CondaError: run 'conda init' before 'conda activate'
这三种我都遇到过。第一种最直接,说明源地址已经失效;第二种是因为 conda 在尝试连接失效源时反复重试;第三种是 PowerShell 执行策略和 conda 初始化脚本冲突导致的,和镜像源问题叠加在一起,特别容易让人懵。
3. Plan B 方案选型:三条路怎么选
3.1 方案一:切换到其他国内镜像源
最省事的思路是找另一个还在提供 Anaconda 镜像的国内站点。目前还在运营的包括阿里云、中科大、豆瓣等镜像站。阿里云的 conda 镜像地址是 https://mirrors.aliyun.com/anaconda/,中科大是 https://mirrors.ustc.edu.cn/anaconda/。
这个方案的优点是改动最小,只需要把 .condarc 文件里的源地址换一下就行,之前的所有使用习惯都不用变。缺点是这些镜像站同样面临授权风险,说不定哪天也会跟进停掉。而且阿里云的 Anaconda 镜像更新频率不如清华源,有些新包可能同步不及时。
我实测下来,阿里云镜像目前还能正常用,下载速度也还可以,但我不建议把它当作长期方案,更适合作为过渡期的临时选择。
3.2 方案二:全面转向 conda-forge 社区源
这是我认为最值得推荐的长期方案。conda-forge 是完全开源的社区仓库,不受任何商业授权限制,包的数量超过 2 万个,更新非常活跃。清华源虽然停了 Anaconda 镜像,但 conda-forge 的镜像还在,地址是 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/。
把 conda 的默认源完全切换到 conda-forge,配合清华的 conda-forge 镜像,既能享受国内下载速度,又不用担心授权问题。这个方案的核心操作是修改 .condarc,把 default_channels 和 channels 都指向 conda-forge。
需要提醒的是,conda-forge 和 defaults 源的包在命名和依赖关系上偶尔会有差异,切换后可能需要重新创建环境,不能直接复用之前基于 defaults 建的环境。这是切换成本,但一次搞定后长期受益。
3.3 方案三:conda 管环境 + pip 装包
第三条路是混合打法:用 conda 只负责创建和管理虚拟环境(因为 conda 的环境隔离做得确实好),具体的包全部用 pip 从 PyPI 镜像安装。PyPI 的国内镜像非常成熟,清华的 PyPI 镜像 https://pypi.tuna.tsinghua.edu.cn/simple 一直很稳定,不受 Anaconda 授权问题影响。
这个方案的好处是彻底绕开了 conda 的包源问题,pip 生态的包覆盖度也足够广。缺点是有些科学计算包(比如某些需要编译的库)用 conda 装会更省事,pip 装可能需要处理编译依赖。另外 conda 和 pip 混用有时候会出现依赖冲突,需要小心管理。
我的实际做法是方案二为主、方案三为辅:环境用 conda 建,能用 conda-forge 装的包就用 conda 装,conda-forge 里没有的再用 pip 补。下面详细讲具体怎么配置。
4. 手把手配置 conda-forge 镜像源
4.1 先备份现有的 .condarc 文件
动手之前先备份,这是铁律。.condarc 文件在 Windows 下位于 C:\Users\你的用户名\.condarc,Linux 和 macOS 下在 ~/.condarc。先把它复制一份:
BASH
复制
1
copy C:\Users\howard\.condarc C:\Users\howard\.condarc.bak
Linux 下:
BASH
复制
1
cp ~/.condarc ~/.condarc.bak
备份的意义在于,万一新配置有问题,可以一键回滚。我见过太多人改配置文件改崩了又不知道怎么恢复,最后只能重装 conda,浪费大半天时间。
4.2 写入新的 .condarc 配置
备份完成后,用文本编辑器打开 .condarc,把内容替换成下面这套配置。这套配置的核心思路是:默认源全部指向清华的 conda-forge 镜像,同时保留 PyPI 镜像作为 pip 的补充。
YAML
复制
1
channels:
2
- defaults
3
show_channel_urls: true
4
default_channels:
5
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
6
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
7
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
8
custom_channels:
9
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
10
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
11
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
12
nvidia: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
13
ssl_verify: true
这里有个细节要说明:default_channels 里我保留了 pkgs/main 和 pkgs/r 的清华地址,虽然这两个路径的 Anaconda 镜像已经停了,但保留它们不会导致报错,conda 会自动跳过失效的源。如果你追求干净,也可以只留 conda-forge 那一行。
配置写完后,执行清理缓存命令,让 conda 重新拉取源信息:
BASH
复制
1
conda clean -i
这个命令会清掉索引缓存,下次装包时会重新从新源拉取 repodata.json。不清缓存的话,conda 可能还在用旧的源信息,导致配置不生效。
4.3 验证配置是否生效
配置完成后,用下面这条命令验证:
BASH
复制
1
conda config --show channels
正常输出应该是:
BASH
复制
1
channels:
2
- defaults
再用 conda info 看一下源地址:
BASH
复制
1
conda info
在输出的 channel URLs 部分,应该能看到 mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge 开头的地址。如果看到的还是 repo.anaconda.com,说明配置没生效,检查一下 .condarc 的缩进是否正确——YAML 对缩进极其敏感,多一个空格少一个空格都会导致解析失败。
4.4 测试装包速度
验证配置生效后,建一个测试环境跑一下:
BASH
复制
1
conda create -n test-forge python=3.12 numpy pandas -c conda-forge
这条命令会从 conda-forge 源装 Python 3.12 加上 numpy 和 pandas。实测下来,在国内网络环境下,这套配置的下载速度能跑到 5-10 MB/s,和之前用清华 Anaconda 镜像的体验基本一致。如果速度很慢,检查一下是不是 default_channels 里的地址写错了,或者本地网络对清华镜像站有访问限制。
5. PowerShell 环境下的那些坑
5.1 conda init 报错的根因
Windows 用户用 PowerShell 操作 conda 时,最常遇到的报错就是:
BASH
复制
1
CondaError: run 'conda init' before 'conda activate'
这个报错的根本原因是 PowerShell 的执行策略(Execution Policy)限制了 conda 的初始化脚本加载。conda 在安装时会往 PowerShell 的 profile 文件里写一段初始化代码,但如果执行策略是 Restricted,这段代码就不会被执行。
解决办法是先把执行策略改成 RemoteSigned:
POWERSHELL
复制
1
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
然后重新运行 conda 初始化:
BASH
复制
1
conda init powershell
执行完这两步后,关掉 PowerShell 重新打开,应该就能正常 conda activate 了。
5.2 PowerShell 乱码问题
另一个高频问题是 PowerShell 下中文乱码,尤其是 conda 输出的提示信息里带中文的时候。这是因为 PowerShell 默认的编码是 GBK,而 conda 输出的是 UTF-8。
解决办法是在 PowerShell 的 profile 里加上编码设置:
POWERSHELL
复制
1
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
2
$OutputEncoding = [System.Text.Encoding]::UTF8
把这两行加到 $PROFILE 文件里,每次启动 PowerShell 自动生效。$PROFILE 的路径可以用 echo $PROFILE 查看,一般在 C:\Users\你的用户名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1。
5.3 PowerShell 开机自启脚本配置
如果你像我一样,希望每次打开 PowerShell 就自动激活某个 conda 环境,可以在 profile 文件里加一行:
POWERSHELL
复制
1
conda activate base
但要注意,这行必须放在 conda init 生成的初始化代码之后,否则会报“conda 不是内部命令”的错误。正确的顺序是:先让 conda init 的代码执行,再激活环境。
我自己的做法是不自动激活 base 环境,因为 base 环境里包太多容易冲突,需要的时候手动 conda activate 更干净。这个看个人习惯。
5.4 查找文件和复制输出的实用技巧
PowerShell 下查找文件用 Get-ChildItem 配合 -Recurse 和 -Filter:
POWERSHELL
复制
1
Get-ChildItem -Path C:\Users\howard -Recurse -Filter "*.condarc" -ErrorAction SilentlyContinue
复制 PowerShell 的输出,直接选中文本按回车就行,或者用 clip 命令管道:
BASH
复制
1
conda info | clip
这样输出就直接进剪贴板了,比手动选中方便。
6. Linux 环境下的镜像配置差异
6.1 Linux 下 .condarc 的位置和权限
Linux 下 .condarc 在用户主目录 ~/.condarc,配置内容和 Windows 基本一致。但要注意权限问题:如果之前用 sudo 装过 conda,.condarc 的属主可能是 root,普通用户改不了。用 ls -la ~/.condarc 看一下属主,如果是 root,执行:
BASH
复制
1
sudo chown $USER:$USER ~/.condarc
把属主改回自己,再编辑。
6.2 Linux 设置 Anaconda 环境变量
Linux 下 conda 装完后,需要把 conda 的可执行文件路径加到 PATH 里。编辑 ~/.bashrc:
BASH
复制
1
export PATH="$HOME/anaconda3/bin:$PATH"
然后 source ~/.bashrc 生效。如果你用的是 zsh,改 ~/.zshrc。这一步不做的话,每次都要用绝对路径调 conda,很麻烦。
6.3 Linux 镜像安装的注意事项
Linux 下装 Miniconda 比装完整版 Anaconda 更推荐,因为 Anaconda 完整版预装了几百个包,很多用不上,还占几个 G 的空间。Miniconda 只有 conda 和 Python 基础环境,干净轻量。
下载 Miniconda 安装脚本后,用 bash Miniconda3-latest-Linux-x86_64.sh 执行安装。安装过程中会问你是否 conda init,选 yes。装完后重新登录 shell,conda 命令就能用了。
7. 常见问题速查与排查技巧
7.1 问题速查表
问题现象
可能原因
解决方法
404 NOT FOUND
源地址失效
检查 .condarc 中的源地址,换成 conda-forge
Solving environment 卡死
源连接超时
conda clean -i 清缓存,检查网络
conda init 报错
PowerShell 执行策略限制
Set-ExecutionPolicy RemoteSigned
中文乱码
编码不匹配
设置 Console OutputEncoding 为 UTF8
装包速度慢
源地址不是国内镜像
确认 default_channels 指向清华镜像
依赖冲突
conda 和 pip 混用
优先用 conda 装,pip 只补 conda 没有的
环境激活失败
初始化未完成
重新 conda init 并重启终端
7.2 排查思路:从源到网络逐层定位
遇到 conda 装包问题时,我的排查顺序是这样的:
第一步,确认源配置。conda config --show channels 和 conda info 看源地址对不对。
第二步,确认网络连通性。用 ping mirrors.tuna.tsinghua.edu.cn 看能不能通,或者用 curl -I 看 HTTP 响应。
第三步,清缓存重试。conda clean -i 清索引缓存,conda clean -p 清包缓存,然后重试。
第四步,换源测试。如果清华源有问题,临时换成阿里云源试试,能通说明是源的问题,不能通说明是本地网络问题。
第五步,看详细日志。conda install -v 加 verbose 参数,能看到具体的连接过程,定位卡在哪一步。
7.3 独家避坑经验
几个我踩过的坑,分享出来帮你省时间:
第一个坑:.condarc 的 YAML 缩进。YAML 用空格缩进,不能用 Tab。我见过有人从网页复制配置,里面混了 Tab,导致 conda 解析失败但报错信息很隐晦,只说“invalid yaml”,不告诉你哪一行有问题。建议用支持 YAML 语法高亮的编辑器,比如 VS Code,一眼就能看出缩进问题。
第二个坑:conda 和 pip 的包冲突。同一个包如果 conda 装过又用 pip 装,会出现两个版本共存,import 的时候不知道加载哪个。我的原则是:能用 conda 装的绝不用 pip,conda 里没有的才用 pip,并且 pip 装完后用 conda list 确认一下包来源。
第三个坑:环境变量污染。如果你之前装过多个 Python 版本,PATH 里可能有多个 python.exe,导致 conda 环境激活后调用的还是系统 Python。用 where python(Windows)或 which python(Linux)确认当前用的是哪个 Python,确保是 conda 环境里的那个。
第四个坑:代理设置残留。如果你之前配过 HTTP 代理,conda 可能会走代理导致连接失败。用 conda config --show proxy_servers 检查,如果有残留就 conda config --remove-key proxy_servers 清掉。
8. 长期方案:把 conda 工作流彻底理顺
8.1 环境命名和版本管理规范
折腾完镜像源之后,我顺便把环境管理规范也理了一遍。环境命名建议用“项目名-用途”的格式,比如 zotero-pdf2zh-server、nlp-train、web-dev,一眼能看出这个环境是干嘛的。Python 版本在创建时就固定好,不要后期升级,因为升级 Python 版本经常导致依赖包不兼容。
创建环境的命令模板:
BASH
复制
1
conda create -n 项目名-用途 python=3.12 -c conda-forge
加 -c conda-forge 明确指定从 conda-forge 装,避免 conda 去连已经失效的 defaults 源。
8.2 导出和复现环境
环境配好后,导出成 yaml 文件,方便在其他机器上复现:
BASH
复制
1
conda env export > environment.yml
这个文件里会记录所有包的精确版本。在另一台机器上复现:
BASH
复制
1
conda env create -f environment.yml
注意,导出的 yaml 里可能包含 defaults 源,复现前手动把 channels 部分改成 conda-forge,避免又去连失效源。
8.3 定期清理无用环境
conda 用久了会积累一堆不用了的环境,占空间还容易混淆。定期清理:
BASH
复制
1
conda env list
2
conda env remove -n 环境名
删环境前确认里面没有还在用的包,删了就找不回来了。
8.4 后续扩展方向
这套 conda-forge 为主的方案跑通之后,还可以进一步优化。比如把常用的包做成一个基础环境模板,新项目直接克隆;或者用 mamba 替代 conda 做依赖求解,速度能快好几倍,mamba 完全兼容 conda 的命令和配置文件,切换成本极低。
mamba 的安装:
BASH
复制
1
conda install -n base -c conda-forge mamba
装完后把命令里的 conda 换成 mamba 就行,比如 mamba create -n test python=3.12。实测依赖求解速度比 conda 快 5-10 倍,尤其是环境复杂的时候差距更明显。
我个人在实际操作中的体会是,镜像源这件事本质上是个“不要把鸡蛋放在一个篮子里”的问题。清华源停掉 Anaconda 镜像只是提醒我们,依赖单一镜像源是有风险的。把 conda-forge 作为主力、pip 作为补充、多个国内镜像站作为备选,这套组合拳打下来,不管哪个源出问题,工作流都不会断。最后再分享一个小技巧:把 .condarc 和 environment.yml 一起纳入项目的版本控制,换机器或者重装系统的时候,两条命令就能把环境恢复如初,省下的时间够你多跑好几轮实验了。