
刚装完 Anaconda 的人十有八九会经历同一个场景敲下conda install numpy光标转了几十秒的圈然后开始以每秒几十 KB 的速度爬最后甩出一个CondaHTTPError: HTTP 000 CONNECTION FAILED。这不是你的网络坏了也不是 Anaconda 本身有问题而是它默认指向的那几个软件源在国内访问体验很差。给 Anaconda 配置国内镜像源本质上是把取索引和取安装包这两条链路都换到国内节点上改完之后同一个包的安装时间往往能从十分钟压到一分钟以内。这篇内容我会把.condarc这个配置文件掰开讲清楚给出一份可以直接抄的配置再把换源之后才会冒出来的一堆新问题channel 优先级、混源冲突、pip 源只改了一半逐条拆开适合刚接触 Anaconda 的新手也适合已经改过源但偶尔还会报错的老用户对照排查。1. Anaconda 装完后第一件该做的事把源换掉1.1 慢和报错的真实来源defaults 通道在哪儿很多人以为 Anaconda 慢是因为包太大其实下载包只占了一小部分时间。conda 安装一个包的动作拆开来看是三步先拉取通道的索引文件repodata.json再在本地做依赖求解Solving environment最后才下载真正的.conda或.tar.bz2包文件。其中第一步的索引文件体积不容小觑——pkgs/main的repodata.json压缩前动辄几十兆即使服务端开了压缩一次完整的索引拉取在国内直连境外节点时也经常要花掉十几秒甚至超时重试。问题就在于Anaconda 默认使用的是defaults这个通道别名它背后指向的是官方域名下的pkgs/main、pkgs/r和pkgs/msys2Windows 专用。索引拉取慢会直接拖垮后面的所有步骤因为求解环境必须先有完整的索引才能开始算。所以你会看到一个很奇怪的现象卡在Solving environment很久但其实 CPU 占用不高因为它在等网络。理解了这一点后面所有的配置动作就都有了明确的针对性——我们要替换的不是下载地址而是索引和包的下载地址这一整条链路。1.2 换源到底换了什么索引文件与包文件两条链路给 Anaconda 配置国内镜像源实际改动的是两个映射关系。第一个映射是default_channels它原本是一组官方 URL镜像站的用法是把它整体替换成国内的对应路径。第二个映射是custom_channelsconda 允许你用短名比如conda-forge、pytorch指向一个基础 URLconda 会自动在这个基础 URL 后面拼上conda-forge、pytorch这样的子路径。镜像站通常会提供一个统一的 cloud 目录前缀把所有第三方通道挂在下面。这两层区分很重要因为在网上抄配置最容易抄错的地方就是把它们混在一起。有人直接把channels里的defaults换成https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main结果发现装 R 语言的包时找不到因为pkgs/r没配Windows 上装某些编译工具链也找不到因为pkgs/msys2没配。正确的做法是保留channels: [defaults]这个别名不动只改它背后的default_channels列表让三个子路径都被覆盖到。1.3 哪些人必须换哪些人可以先不折腾如果你只是偶尔用 Anaconda 打开一次 Jupyter Notebook装包都靠pip那conda源的优先级可以往后排。但下面这几类人建议装完 Anaconda 立刻就把源换掉一是需要频繁创建虚拟环境、拉取 PyTorch 或 TensorFlow 这类大包的人换源前后的体感差距最明显二是在公司内网或校园网环境下工作的人直连境外节点的成功率本来就低不换源会频繁触发超时三是需要复现别人environment.yml的人一旦某个包解析失败整个环境都建不起来。还有一种情况需要单独提一下如果你只是在别人的机器上临时跑一段代码没必要动配置文件。用命令行的-c参数临时指定一次镜像地址就够了改完就走不留痕迹。这也是我给别人临时帮忙时最常用的方式后面第 3 节会给出具体写法。2. 读懂 .condarcAnaconda 配置国内镜像源的核心载体2.1 这个文件在哪儿conda 按什么顺序读.condarc是一个 YAML 格式的文本文件名字前面带点在 Windows 资源管理器里默认是隐藏的很多人第一次找它会以为文件不存在。它的常见位置有三个层次用户级在 Windows 下是C:\Users\你的用户名\.condarc在 Linux 和 macOS 下是~/.condarc系统级在 Anaconda 安装目录的根下比如D:\Anaconda3\.condarc第三层是通过CONDARC这个环境变量指定的路径。conda 会把这些位置的配置合并起来读而不是简单取其中一个。合并的规则是越靠后读到的优先级越高所以用户级的配置可以覆盖系统级命令行参数又能覆盖用户级。这里有个新手最容易困惑的点conda config --set xxx命令默认写的是用户级文件也就是你自己家目录下那个.condarc不会去动安装目录里的。如果你发现配置改了但不生效第一件事就是用conda config --show-sources看看 conda 到底读了哪几个文件往往会发现安装目录下还躺着一份老配置在捣乱。提示如果.condarc一开始不存在不用手动新建先执行conda config --set show_channel_urls yesconda 会自动帮你生成一份然后你再往里加内容能避免一开始就写出格式错误的文件。2.2 channels、default_channels、custom_channels 三者的分工理解这三个键的分工是看懂所有镜像源配置文档的前提。channels是通道列表它决定了 conda 去哪些通道里找包列表顺序等于搜索顺序。default_channels是别名展开表专门用来解释defaults这个别名到底由哪几个 URL 组成。custom_channels是短名前缀表把像conda-forge这样的短名映射到一个基础 URL 上。拿一个具体例子说明。当我在channels里写了defaults和conda-forge两项时conda 会做两次展开defaults被展开成default_channels里列出的那三个 URLconda-forge被展开成custom_channels里conda-forge对应的基础 URL 再拼上/conda-forge。展开完成之后它才拿着最终的那一串真实 URL 去拉索引。这个机制带来的好处是配置可以写得很干净坏处是出错时错误信息里往往只出现展开后的长 URL看不出是哪一项配置出的问题。所以我在自己的配置里一定会加show_channel_urls: true让 conda 在输出时把每个包的真实来源打出来排查时能省掉大量时间。2.3 show_channel_urls 与 channel_priority 两个必留开关show_channel_urls的作用前面已经说了它不影响安装结果只影响输出信息的详细程度。但对国内用户来说这个开关几乎是必开的因为换源之后包的来源会变得多样来自清华镜像的包和来自官方源的包混在一起时你必须能一眼看出每个包是从哪来的。channel_priority则是实打实会改变求解结果的参数它有strict、flexible和disabled三个取值。strict表示低优先级通道里只要存在同名包就直接不考虑哪怕版本更合适flexible表示允许从低优先级通道里挑更高版本的包disabled基本不用。这里有个关键变化conda 在较新的版本里已经把默认值从flexible改成了strict很多老教程里没提这一点导致照抄配置的人在新版本上装包时莫名其妙报冲突。这个坑我会在第 5 节展开讲。3. 动手改源一份可以直接抄的配置与三种落地方式3.1 方式一命令行 config 系列命令逐条设置完全不想碰配置文件的话可以用命令行一条条设置。这套命令的好处是 conda 会帮你处理 YAML 格式不用担心缩进写错。下面是设置清华镜像的一组命令Windows、Linux、macOS 通用conda config --set show_channel_urls yes conda config --set channel_priority flexible conda config --add default_channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add default_channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r conda config --add default_channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 conda config --set custom_channels.conda-forge https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud conda config --set custom_channels.pytorch https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud conda config --set custom_channels.bioconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud注意--add和--set的区别。--add是往列表里追加一项适合channels和default_channels这种列表型配置--set是覆盖赋值适合custom_channels.xxx这种映射型配置。用错的结果通常是列表里出现重复项或者映射被整体替换掉conda config --show一看就能发现。这套命令的缺点是执行完要敲好多行而且一旦想换镜像站得一条条删。所以我在实际使用中更偏向下面这种方式。3.2 方式二直接编辑 .condarc 文件推荐直接编辑文件的效率最高而且可以整体备份、整体替换。下面这份配置我用了很久把三大类通道都覆盖到了channels: - defaults - conda-forge show_channel_urls: true channel_priority: flexible default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud nvidia: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud ssl_verify: true抄这份配置时有几个细节必须注意。YAML 用空格缩进绝对不能用 Tab两个空格是社区惯例。键名后面的冒号必须跟一个空格写成show_channel_urls:true是无效的。列表项的-后面要有一个空格。最关键的一点是 URL 本身的冒号不会引发解析问题因为https://里冒号后面紧跟的是斜杠而不是空格YAML 不会把它误判成键值对——但如果手滑写成https: //xxx中间多了个空格文件立刻就废了这是我最常遇到的低级错误。注意在 Windows 上用记事本编辑.condarc时一定要确认保存编码是 UTF-8 且不带 BOM。带 BOM 的文件在 conda 看来开头会多出几个不可见字符直接导致解析失败报错信息还很不直观。用 VS Code 或 Notepad 编辑并选择UTF-8不是UTF-8 with BOM最保险。3.3 方式三指定 -c 参数临时走镜像不想动全局配置时用-c指定通道配合--override-channels屏蔽掉配置文件里的所有通道conda install numpy --override-channels -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main--override-channels这个参数知道的人不多但它非常有用。不加它的时候-c指定的通道只是被加到原有通道列表的最前面配置文件里的通道依然参与求解加上它之后conda 完全忽略配置文件里的通道只用命令行指定的。在排查是不是配置文件在捣乱这类问题时这个参数能帮你快速做二分定位。这种方式适合临时救急缺点是每次都要敲一长串地址手打容易出错建议把它写成 shell 别名或者脚本固化下来。3.4 主流国内镜像源横向对比与选型建议国内可用的 Anaconda 镜像站不止一家各自的路径和同步策略略有差异。下面这张表是我自己实测和整理的结果具体路径可能随镜像站调整而变化用之前建议去对应镜像站的帮助页面确认一次镜像站pkgs/main 路径前缀特点我的使用建议清华 TUNAhttps://mirrors.tuna.tsinghua.edu.cn/anaconda文档最全同步频率高cloud 通道覆盖广个人开发机默认选它中科大 USTChttps://mirrors.ustc.edu.cn/anaconda教育网内延迟低同步及时校园网环境优先阿里云https://mirrors.aliyun.com/anaconda带宽充足云上访问快云服务器上跑任务北外 BFSUhttps://mirrors.bfsu.edu.cn/anacondacloud 通道相对齐全需要 conda-forge 时备选上海交大https://mirror.sjtu.edu.cn/anaconda华东地区访问快备用镜像选型上没有绝对的优劣我的习惯是主用清华同时在心里记一个备用站。原因是镜像站偶尔会因为同步任务积压或者维护短暂不可用这时候如果default_channels里只写了一个站就会变成完全装不了包。稳妥的做法是在列表里放两个不同镜像站的同一条通道作为冗余虽然 conda 会按顺序取第一个能用的但第一个挂掉时能自动落到第二个。不过冗余也不是越多越好。default_channels里的每一项在求解时都要去拉索引项数太多会明显拖慢首次索引拉取的时间。我一般控制在两到三项比如pkgs/main放清华和中科大两个地址其余通道放一个。4. 改完之后怎么确认真的生效4.1 conda config --show-sources 看配置有没有被读到改完配置后不要急着装包先执行conda config --show-sources它会列出 conda 实际读到的所有配置文件路径以及每个文件里的内容。这一步能解决大部分我明明改了却没生效的问题。常见的意外有三种改的是安装目录下的文件但用户级文件把它覆盖了文件里存在 YAML 语法错误conda 静默跳过了整个文件编辑完忘了保存或者保存到了另一个同名文件上。如果输出里看到了你的目标文件且内容和你写的一致这一层就算过了。如果压根没出现目标文件去检查文件路径和文件名Windows 下特别容易犯的错是把文件存成了.condarc.txt因为资源管理器默认隐藏已知扩展名。4.2 conda info 与 show_channel_urls 看包到底从哪来第二层确认是看运行时行为conda info输出里的channel URLs部分会列出当前环境实际生效的所有通道地址。如果这里显示的还是官方域名说明配置没被正确读取回到上一步排查。如果显示的是镜像域名那说明通道层已经换完了。第三层是装包时观察输出。因为在配置里开了show_channel_urls: trueconda 在下载每个包时会打印它的完整来源 URL。这时候如果看到的是mirrors.tuna.tsinghua.edu.cn就可以确认包确实从镜像下载了。如果看到的是官方域名那可能是某个通道没被custom_channels覆盖到需要补配置。4.3 用干净的小环境做一次真实验证最快的端到端验证方式是建一个小环境conda create -n mirror_test python3.11 numpy -y选择python加numpy这个组合是有讲究的。python来自pkgs/mainnumpy在pkgs/main和conda-forge里都有这两个包体量适中能在几十秒内跑完整个流程同时又能触发索引拉取、依赖求解、包下载三个环节。如果全部顺利完成说明配置没问题如果卡在求解阶段大概率是通道优先级的问题如果卡在下载阶段可能是镜像站临时不可用。验证完记得把测试环境删掉别让它一直占着磁盘conda env remove -n mirror_test第一次拉索引会慢一些因为本地索引缓存是空的。第二次之后就能明显感觉到快了这也是判断配置是否生效的一个直观依据——如果每次装包都像第一次那样慢说明索引缓存没建立起来。5. 换源后的新麻烦channel 优先级与混源冲突5.1 strict 与 flexibleconda 新版本的默认值变了这是近几年最容易踩的坑我至少帮三个人排查过同一个问题。现象是明明配了清华镜像装numpy却报PackagesNotFoundError或者求解出一堆奇怪的冲突而换回官方源就正常。原因就是 conda 新版把channel_priority的默认值改成了strict。strict的语义是通道列表里靠前的通道一旦存在某个包名后面的通道里即使有更高版本也不考虑。当你写了channels: [defaults, conda-forge]时defaults在conda-forge前面那么所有在defaults里出现过的包都只会从defaults里取版本。这本身不算错但问题在于镜像站的同步是有延迟的defaults镜像上某个包的版本可能比conda-forge上落后很多甚至某些平台的文件还没同步过来于是求解器就找不到能满足所有约束的组合。解决方法很简单在.condarc里显式写上channel_priority: flexibleflexible会允许求解器跨通道挑选更高版本代价是可能引入来自不同通道的包组合需要在少数情况下手动统一版本。对绝大多数日常使用场景flexible的体验更好装不上的概率明显更低。5.2 混用 defaults 与 conda-forge 时最容易出现的两类怪现象第一类怪现象是装上了但用不了。典型表现是装完某个包之后import时报缺少底层动态库。这通常是因为主包来自defaults而它依赖的某个底层库来自conda-forge两个通道的构建方式不同二进制接口对不上。conda 本身能求解出这样的组合但运行时就出问题。第二类怪现象是版本回退。你在defaults里已经装了某个包的 2.x 版本想升级到 3.x但 3.x 只在conda-forge上有strict模式下就升不上去。改成flexible之后能升但可能会连带把一批依赖也换成conda-forge的版本。对这两类问题我的处理原则是一个环境里尽量只用一套通道体系。如果项目明确要用conda-forge那就在创建环境时就把conda-forge放在channels的第一位或者干脆用--override-channels -c conda-forge只用它。混着用虽然大多数时候没事但一旦出事排查成本比一开始就统一通道高得多。5.3 镜像同步滞后导致的 PackagesNotFoundError镜像站不是实时同步的官方源发布新包之后镜像通常要过一段时间才会跟上具体间隔各站不同。这会导致一个很尴尬的情况官方源上明明有这个包镜像上就是查不到报错信息里的通道 URL 还是镜像地址看起来像是配置写错了。判断方法很简单把通道临时切回官方源试一次conda install 包名 --override-channels -c defaults能装上就说明是同步滞后不是配置问题。这时的应对方式有三种等一段时间再试换一个同步更快的镜像站或者这一次临时用官方源装装完再切回镜像。我个人一般选第二种因为国内几个镜像站的同步速度差异确实存在换一个往往立刻就能解决。还有一种情况需要留意某些通道的某个平台目录可能根本没被镜像收录。比如pkgs/msys2只在 Windows 上有意义如果你在 Linux 上把conda config --show里的通道全列出来看会发现有些地址其实用不上。这不影响使用conda 只会去拉符合当前平台的部分。6. conda 和 pip 是两套东西别只改一半6.1 conda 源与 pip 源各管什么有个概念必须掰清楚conda和pip是两个独立的包管理器各自维护各自的索引和缓存配置文件也是分开的。你给 Anaconda 配好了国内镜像源用conda install装包确实会走镜像但如果你在同一个环境里敲pip install它走的是 PyPI 的源跟.condarc里写了什么毫无关系。这一点在新手身上特别容易造成困惑。有人跑来问我配置都按教程做了怎么还是慢一看他实际执行的是pip install而我的教程讲的是.condarc。所以这里必须明确一句话改.condarc只影响 conda 命令不影响 pip 命令。两者各有分工。conda 擅长管理带二进制依赖的科学计算包它能同时管理 Python 解释器版本和底层的 C、Fortran 库pip 擅长管理纯 Python 包生态覆盖更全新包上线更快。日常使用中两者往往是混着用的所以两边的源都得配。6.2 pip 国内镜像源的两种配置方式与路径差异pip 的配置有两种粒度全局和用户级。最省事的写法是pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn pip config listpip config list用来确认写入结果。这两条命令默认写的是用户级配置文件位置在 Windows 下是%APPDATA%\pip\pip.ini在 Linux 和 macOS 下是~/.config/pip/pip.conf。如果你想让配置对所有用户生效需要加--global参数但那样一般要求管理员权限。也可以直接写文件内容形如[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn需要说明的是现在主流镜像站都支持 HTTPStrusted-host严格来说不是必需的它的作用是跳过对非标准证书链的校验。我保留这一行是因为偶尔会遇到公司内网证书替换的情况写着不碍事。如果不确定自己的 pip 到底读了哪个配置文件执行python -m pip config debug会把它检查过的所有路径和最终生效的值都打印出来比盲猜快得多。6.3 在 conda 环境里用 pip 时容易踩的顺序问题在 conda 创建的环境里用 pip有一个顺序原则值得记住能用 conda 装的先用 conda 装conda 里确实没有的再用 pip 装。原因是 conda 会记录它安装过的所有包的元数据在后续求解时纳入考虑而 pip 装的包在 conda 的依赖图里是个黑盒conda 不知道它依赖了什么。反过来操作先 pip 装了某个包再 conda 装一个依赖它的东西conda 可能会把 pip 装的那份覆盖掉或者装出两份共存运行时到底加载哪一份取决于路径顺序。还有一个细节确保你用的是当前环境里的 pip。在 Windows 上激活环境后执行where pip在 Linux 上执行which pip确认输出路径在当前环境目录下。如果指向的是 base 环境的 pip那装出来的包会跑到 base 里去当前环境里import又找不到非常迷惑。提示如果环境里已经被 pip 和 conda 装乱了最干净的解决方式是删掉重建。用conda env export --no-builds env.yml导出后手动精简再conda env create -f env.yml重建比在一个已经混乱的环境里反复修补效率高得多。7. 逐条排查Anaconda 配置国内镜像源后的高频报错7.1 Could not parse .condarc 与 Invalid YAML这个报错的意思是配置文件格式错误conda 无法解析。触发原因按出现频率排序大致是用了 Tab 缩进、键名冒号后没加空格、URL 里混入了多余空格、文件编码带 BOM、列表项漏了短横线。排查方式是打开文件把内容删到一个最小可用版本再一段一段加回来channels: - defaults default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main如果这个最小版本能跑通说明后面的某一项有问题逐项加回就能定位。注意删配置的时候要把custom_channels一起考虑进来它下面的某个子项写错了同样会导致整个文件解析失败。缩进层次也要检查一遍custom_channels下的子项必须比父键多缩进两个空格。7.2 CondaHTTPError 与请求超时CondaHTTPError是网络层报错常见形态包括HTTP 000 CONNECTION FAILED、HTTP 404、HTTP 403。这三种含义完全不同不能混为一谈。HTTP 000表示连接根本没建立起来通常是镜像站地址写错、DNS 解析失败或者本机网络策略拦截。先ping或直接在浏览器里打开你配置的那个repodata.json地址能打开说明地址没问题。HTTP 404表示地址能连上但路径不存在一般是镜像站的目录结构变了或者你少写了一层路径。前面提到的几个镜像站路径前缀用之前建议去站点的帮助页面核对一次。HTTP 403表示服务端拒绝这种情况在镜像站上不常见遇到时换一个镜像站通常就好了。还有一类不是错误但很烦人的现象装包过程反复重试。这通常是镜像站瞬时负载高conda 自带重试机制会自己扛过去只要最终成功就不用管。7.3 配置改乱了怎么回滚改配置之前先备份一份这是成本最低的习惯cp ~/.condarc ~/.condarc.bakWindows 上把~/.condarc换成实际路径或者用复制粘贴操作也行。回滚的时候直接覆盖回来就完事了比一条条删配置快得多。如果没备份用命令行逐项清除conda config --remove-key default_channels conda config --remove-key custom_channels conda config --remove-key channel_priority conda config --remove-key show_channel_urls--remove-key会删掉整个键包括它下面的所有子项。删完之后执行conda config --show确认一下。如果要连channels里手动加过的项也清掉用conda config --remove channels 通道地址逐条删注意删到只剩defaults一项时就不要再删了那是 conda 的默认行为。下面这张表把常见报错和对应的第一排查动作列在一起出问题时可以直接照着看报错关键字最可能的原因第一排查动作Could not parse .condarcYAML 格式错误用最小配置测试HTTP 000地址错或网络不通浏览器打开 repodata.jsonHTTP 404镜像路径不存在核对镜像站帮助页PackagesNotFoundError同步滞后或优先级过严改用 flexible 或临时切官方源求解冲突跨通道混用统一到单一通道体系卡在 Solving environment索引拉取慢或项数过多精简 default_channels 项数8. 多机与团队场景把配置固化下来8.1 备份与分发 .condarc自己电脑上的配置调好之后值得把这份.condarc存一份到笔记或者代码仓库里。换电脑、重装系统、给同事配环境时直接复制过去就完事能省掉重新查文档的时间。我自己的做法是在个人笔记里存一份带注释的模板把镜像站地址单列出来需要换站时只改这几行。给团队分发时有个细节需要注意每个人的家目录路径不同但.condarc的内容是完全一样的因为它只包含配置项不包含绝对路径。所以直接把文件内容交给别人让他们保存到自己的用户目录下即可。如果团队里有人用 Windows 有人用 Linux同一份文件也是通用的conda 在两边解析同一份 YAML 的结果一致。如果要在团队里统一管理还有一招是把.condarc放在项目仓库里然后通过设置CONDARC环境变量指向它或者用conda install --file配合通道参数。这样项目成员拉下代码之后就自带通道配置不依赖各自的全局设置。这种方式在需要严格复现的环境里很有价值因为通道列表本身也会影响求解结果。8.2 内网与离线环境下的替代思路完全断网或者只有内网访问权限的机器上镜像站也访问不了这时需要的是本地通道。思路是用conda index在本地目录上建索引然后在.condarc里用file://协议指向它conda index /data/conda-channel/linux-64channels: - defaults default_channels: - file:///data/conda-channel本地的包文件可以从一台能联网的机器上下载好再拷贝过去。下载时用conda install --download-only可以把包存到本地而不安装再把pkgs目录整体搬过去。这种方式在小规模内网里够用包数量多了之后手工维护索引会比较累那就需要考虑搭建一个内网的镜像服务了。需要留意的是本地通道建立之后.condarc里就不要再保留任何指向外网的地址了否则 conda 每次求解还是会去尝试连接拖慢速度还可能因为超时报错。用conda config --show-sources确认一遍生效的配置里没有外网地址。8.3 版本升级后需要重新检查的地方conda 自身升级之后有几个地方值得重新确认一次。最先要检查的是channel_priority的实际取值用conda config --show channel_priority看。如果之前没显式设置过、依赖的是默认值升级后默认值可能已经变了行为跟着变。第二个要检查的是repodata.json的缓存格式。conda 在某些版本里引入了新的索引缓存机制升级后旧缓存可能失效表现为升级后第一次装包特别慢。这是正常现象跑一次就恢复了。如果慢得不正常用conda clean -i清掉索引缓存重建一次conda clean -i第三个是包缓存目录。conda clean -a会把索引缓存和包缓存全部清掉能释放几个 GB 的磁盘空间但下次装包时需要重新下载。我一般是在更换镜像站之后执行一次conda clean -i确保不会拿旧镜像的缓存去比对新镜像的索引-a则留到磁盘紧张时再用。最后提一个容易被忽略的点如果你同时装了 Anaconda 和 Miniconda或者装了多个版本要注意conda命令实际调用的是哪一个。用which conda或where conda确认不同安装位置读的可能是不同的系统级.condarc。我在一台机器上就遇到过系统里两份安装、PATH顺序不同导致配置看起来时灵时不灵的情况最后发现是两个安装目录各自有一份配置文件。把不用的那份卸载掉或者统一PATH顺序之后就再没出过这个问题。