结论是conda依赖求解器因缓存损坏、频道优先级冲突或版本约束矛盾导致逻辑死循环,需先执行conda clean --all --yes清空元数据缓存,并设置channel_priority strict以强制按频道顺序求解。

直接说结论:这不是网络卡,也不是你命令写错了,而是 conda 的依赖求解器在“算不出解”——它手头的包信息、版本约束、频道优先级三者对不上,卡在逻辑推演里了。
为什么 conda clean --all 不能跳过,必须先执行
本地缓存的 repodata.json 文件一旦损坏或过期,conda 就会拿着旧的包列表去硬解新需求,比如你要求 pytorch=2.4,但缓存里只有 pytorch=1.12 的元数据,求解器根本看不到合法选项,只能无限重试。这不是清不清镜像源的问题,是“算据”本身失效了。
-
conda clean --all --yes会删掉所有pkgs/、index/cache/和未使用的 tarball,强制后续操作重新拉取元数据 - 只用
conda clean -i(仅清索引)往往不够,因为损坏常发生在current_repodata.json的解析层 - Windows 用户注意:
conda clean不会动%USERPROFILE%\.condarc,配置还在,但缓存一空,下次运行就自动重载镜像源
换清华源后仍卡住,大概率是频道顺序没设 strict
加了清华源却还从 defaults 拿包,就会出现“同一个包在两个频道有冲突版本”的情况,比如 numpy 在 defaults 是 1.26,在 conda-forge 是 1.27,求解器无法自动判别该信谁。这时候它不是慢,是陷入逻辑死循环。
- 执行
conda config --set channel_priority strict,让 conda 严格按conda config --show channels输出的顺序选频道 - 确认
conda-forge或pytorch频道排在defaults前面(尤其装深度学习库时) - 避免混用
https://和http://地址,部分旧版 conda 对 HTTP 重定向处理异常
遇到 failed with initial frozen solve. Retrying with flexible solve 别中断
这行日志不是报错,是 conda 在降级策略:先尝试“所有包锁死版本”(frozen),失败后改用“允许小范围浮动版本”(flexible)。如果你此时 Ctrl+C,环境状态会残留在半解析态,再跑可能触发更隐蔽的缓存污染。
- 等满 2 分钟再判断是否真卡住;实测多数
pytorch+cuda-toolkit组合在 strict 模式下需 40–90 秒 - 若超时,立刻补上
--override-channels -c pytorch -c conda-forge,绕过默认频道干扰 - 不要在已有复杂环境里直接
conda install大型包,优先用environment.yml显式声明所有依赖
真正容易被忽略的点是:conda 的求解行为高度依赖你当前所在环境。base 环境装了一堆杂包,再建新环境时求解器会把它也纳入约束范围——哪怕你指定了 python=3.9,它仍要确保新环境和 base 兼容。所以最干净的起点,永远是新开一个终端,不激活任何环境,直接 conda create -n myenv python=3.9。











