Conda 创建环境报错:Unable to read repodata JSON file,清华源 pkgs/free 失效解决方法

Conda 创建环境报错:Unable to read repodata JSON file,清华源 pkgs/free 失效解决方法

文章目录

  • [Conda 创建环境报错:Unable to read repodata JSON file,清华源 pkgs/free 失效解决方法](#Conda 创建环境报错:Unable to read repodata JSON file,清华源 pkgs/free 失效解决方法)
    • 问题描述
    • [2 问题分析](#2 问题分析)
      • [2.1 问题环境](#2.1 问题环境)
      • [2.1 完整报错中的关键信息](#2.1 完整报错中的关键信息)
      • [2.3 为什么会出现这个问题?](#2.3 为什么会出现这个问题?)
    • [3 最快解决方法:临时绕过所有旧源](#3 最快解决方法:临时绕过所有旧源)
    • [4 永久解决:删除 `.condarc` 中失效的 pkgs/free](#4 永久解决:删除 .condarc 中失效的 pkgs/free)
      • [4.1 用 `sed` 修改配置](#4.1 用 sed 修改配置)
      • [4.2 手动修改 `.condarc`](#4.2 手动修改 .condarc)
    • [5 相关问题解答](#5 相关问题解答)
      • [5.1 如何快速定位到底是哪个 Conda 源坏了?](#5.1 如何快速定位到底是哪个 Conda 源坏了?)
      • [5.2 为什么清理 index cache 也很重要?](#5.2 为什么清理 index cache 也很重要?)
    • [6 总结](#6 总结)

问题描述

最近在 AutoDL 上部署 map-anything 项目时,准备使用 Conda 创建一个 Python 3.12 环境:

bash 复制代码
conda create -n mapanything python=3.12 -y

结果在获取 Conda 软件源索引时报错 Collecting package metadata (repodata.json): failed(以下为完整命令及输出内容):

bash 复制代码
root@autodl-container-179442a4e1-5f03f439:~/map-anything# conda create -n mapanything python=3.12 -y
Channels:
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
 - defaults
Platform: linux-64
Collecting package metadata (repodata.json): failed

# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<<<

    Traceback (most recent call last):
      File "/root/miniconda3/lib/python3.12/site-packages/conda/exception_handler.py", line 17, in __call__
        return func(*args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda/cli/main.py", line 83, in main_subshell
        exit_code = do_call(args, parser)
                    ^^^^^^^^^^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda/cli/conda_argparse.py", line 199, in do_call
        result = getattr(module, func_name)(args, parser)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda/notices/core.py", line 131, in wrapper
        return func(*args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda/cli/main_create.py", line 125, in execute
        return install(args, parser, "create")
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda/cli/install.py", line 372, in install
        unlink_link_transaction = solver.solve_for_transaction(
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda/core/solve.py", line 148, in solve_for_transaction
        unlink_precs, link_precs = self.solve_for_diff(
                                   ^^^^^^^^^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda/core/solve.py", line 217, in solve_for_diff
        final_precs = self.solve_final_state(
                      ^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda_libmamba_solver/solver.py", line 207, in solve_final_state
        index = IndexHelper(
                ^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda_libmamba_solver/index.py", line 136, in __init__
        self._index = self._load_channels()
                      ^^^^^^^^^^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda_libmamba_solver/index.py", line 337, in _load_channels
        info = self._json_path_to_repo_info(url, jsons[url])
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/miniconda3/lib/python3.12/site-packages/conda_libmamba_solver/index.py", line 293, in _json_path_to_repo_info
        repo = api.Repo(self._pool, noauth_url, str(path_to_use), escape_channel_url(noauth_url))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    RuntimeError: Unable to read repodata JSON file 'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarch', error was: repository does not start with an object

`$ /root/miniconda3/bin/conda create -n mapanything python=3.12 -y`

  environment variables:
                 CIO_TEST=<not set>
               CONDA_ROOT=/root/miniconda3
           CURL_CA_BUNDLE=<not set>
          LD_LIBRARY_PATH=/usr/local/cuda/lib64
               LD_PRELOAD=<not set>
             LIBRARY_PATH=/usr/local/cuda/lib64/stubs
                     PATH=/root/miniconda3/bin:/usr/local/bin:/root/miniconda3/bin:/usr/local/bi
                          n:/root/miniconda3/bin:/usr/local/bin:/usr/local/cuda/bin:/usr/local/s
                          bin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
       REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
            SSL_CERT_FILE=<not set>

     active environment : None
       user config file : /root/.condarc
 populated config files : /root/.condarc
          conda version : 24.4.0
    conda-build version : not installed
         python version : 3.12.3.final.0
                 solver : libmamba (default)
       virtual packages : __archspec=1=icelake
                          __conda=24.4.0=0
                          __cuda=13.2=0
                          __glibc=2.35=0
                          __linux=5.15.0=0
                          __unix=0=0
       base environment : /root/miniconda3  (writable)
      conda av data dir : /root/miniconda3/etc/conda
  conda av metadata url : None
           channel URLs : https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64
                          https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/noarch
                          https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64
                          https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarch
                          https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64
                          https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/noarch
                          https://repo.anaconda.com/pkgs/main/linux-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/r/linux-64
                          https://repo.anaconda.com/pkgs/r/noarch
          package cache : /root/miniconda3/pkgs
                          /root/.conda/pkgs
       envs directories : /root/miniconda3/envs
                          /root/.conda/envs
               platform : linux-64
             user-agent : conda/24.4.0 requests/2.31.0 CPython/3.12.3 Linux/5.15.0-113-generic ubuntu/22.04.5 glibc/2.35 solver/libmamba conda-libmamba-solver/24.1.0 libmambapy/1.5.8 aau/0.4.4 c/. s/. e/.
                UID:GID : 0:0
             netrc file : None
           offline mode : False


An unexpected error has occurred. Conda has prepared the above report.
If you suspect this error is being caused by a malfunctioning plugin,
consider using the --no-plugins option to turn off plugins.

Example: conda --no-plugins install <package>

Alternatively, you can set the CONDA_NO_PLUGINS environment variable on
the command line to run the command without plugins enabled.

Example: CONDA_NO_PLUGINS=true conda install <package>

其中最关键的一段异常是:

text 复制代码
RuntimeError: Unable to read repodata JSON file
'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarch',
error was: repository does not start with an object

一开始很容易怀疑是 CUDA、Python 版本、AutoDL 实例或者 Conda 本身出了问题。实际上这个问题和 CUDA 基本没有关系,真正的原因是 Conda 配置中仍然存在已经失效的清华镜像源 pkgs/free ,导致 libmamba 无法正常读取 repodata.json

本文记录一下完整排查过程以及解决方法。


2 问题分析

2.1 问题环境

当前环境大致如下:

text 复制代码
系统:Ubuntu 22.04
Conda:24.4.0
Python:3.12.3
Solver:libmamba
CUDA:13.2(宿主环境识别结果)
平台:linux-64

执行:

bash 复制代码
conda create -n mapanything python=3.12 -y

Conda 显示的软件源为:

text 复制代码
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
defaults

随后在 Collecting package metadata (repodata.json) 阶段失败。

2.1 完整报错中的关键信息

报错虽然很长,但其中值得关注的是:

text 复制代码
RuntimeError: Unable to read repodata JSON file
'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarch',
error was: repository does not start with an object

注意这里的地址:

text 复制代码
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarch

问题就出在 pkgs/free 这个 Channel。

Conda 尝试将服务器返回的内容作为仓库的 repodata.json 解析,但返回内容并不是合法的 Conda 仓库 JSON 数据,因此 libmamba 直接终止。

2.3 为什么会出现这个问题?

Conda 配置文件位于 /root/.condarc,也就是 ~/.condarc,其中还保留着类似下面的旧配置:

yaml 复制代码
channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
  - defaults

这里的问题是,https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free 已经不应该继续作为当前 Conda 配置中的有效软件源使用,但是 Conda 每次创建环境时仍然会尝试访问:

text 复制代码
pkgs/free/linux-64
pkgs/free/noarch

最终导致 repository does not start with an object。所以不是 Python 3.12 、CUDA、GPU 等有问题,也不需要重新租 AutoDL 实例,它是一个 Conda Channel 配置问题。


3 最快解决方法:临时绕过所有旧源

如果当前目标只是把环境创建出来,最简单的方法不用立刻修改所有 Conda 配置,而是使用 --override-channels。具体步骤:

  1. 先清理 Conda 的索引缓存:
bash 复制代码
conda clean --index-cache -y
  1. 然后创建环境:
bash 复制代码
conda create -n mapanything python=3.12 pip -y \
  --override-channels \
  -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main

其中关键的是 --override-channels,它的作用可以理解为:本次 Conda 操作不要读取 .condarc 中配置的其他 Channel,只使用我命令行明确指定的软件源

因此即使 .condarc 中还存在 pkgs/free,这一次创建环境也不会访问它。

环境创建完成以后执行 conda activate mapanything 激活环境。

4 永久解决:删除 .condarc 中失效的 pkgs/free

第3节中的解决方法中的 --override-channels 只是让当前命令绕过错误 Channel。如果以后还要长期使用 Conda(例如是在自己的设备上而不是在云服务器上的情况),建议直接修复 ~/.condarc

4.1 用 sed 修改配置

首先备份:

bash 复制代码
cp ~/.condarc ~/.condarc.bak

然后删除所有包含 pkgs/free 的配置:

bash 复制代码
sed -i '/pkgs\/free/d' ~/.condarc

清理索引缓存:

bash 复制代码
conda clean --index-cache -y

之后可以检查当前 Conda 软件源:

bash 复制代码
conda config --show channels

或者:

bash 复制代码
conda info

确认输出中已经不存在:

text 复制代码
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free

4.2 手动修改 .condarc

如果不喜欢直接用 sed 修改配置,也可以也可以手动修改 .condarc

先查看内容:

bash 复制代码
cat ~/.condarc

然后:

bash 复制代码
vim ~/.condarc

或者:

bash 复制代码
nano ~/.condarc

找到类似 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free 的地方,直接删除这一行即可。

P.S. 这里推荐使用 Gedit 文本编辑器 对该文件进行修改,其可视化界面中编辑等操作更简单、更加用户友好。

例如原来的内容是:

yaml 复制代码
channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
  - defaults

修改成:

yaml 复制代码
channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
  - defaults

保存以后再执行:

bash 复制代码
conda clean --index-cache -y

5 相关问题解答

5.1 如何快速定位到底是哪个 Conda 源坏了?

以后遇到类似:

text 复制代码
Collecting package metadata (repodata.json): failed

这样的报错,可以找 Unable to read repodata JSON file,例如:

text 复制代码
Unable to read repodata JSON file
'https://xxx/xxx/noarch'

这个 URL 基本就是重点排查对象。

然后执行:

bash 复制代码
conda info

查看 channel URLs 或者 conda config --show-sources。这个命令尤其好用,可以查看 Conda 到底从哪些配置文件读取了配置。

再执行:

bash 复制代码
conda config --show channels

查看最终的软件源列表。

5.2 为什么清理 index cache 也很重要?

修改 Channel 以后,建议执行:

bash 复制代码
conda clean --index-cache -y

原因是 Conda 会缓存已经下载的软件仓库索引。如果之前访问错误源时产生了异常或过期的缓存,仅仅修改 .condarc 有时并不足以让后续行为完全恢复正常。

所以比较推荐的操作顺序是:

bash 复制代码
sed -i '/pkgs\/free/d' ~/.condarc # 修改 Channel
conda clean --index-cache -y # 清理 index cache
conda create -n mapanything python=3.12 -y #重新创建环境

6 总结

这次问题的核心报错是:

text 复制代码
RuntimeError: Unable to read repodata JSON file
'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarch'

问题的根本原因是 ~/.condarc 中残留了旧的 pkgs/free 软件源。

  1. 临时解决方法:
bash 复制代码
conda create -n mapanything python=3.12 pip -y \
  --override-channels \
  -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  1. 永久解决方法:
bash 复制代码
cp ~/.condarc ~/.condarc.bak
sed -i '/pkgs\/free/d' ~/.condarc
conda clean --index-cache -y

之后再正常创建 Conda 环境即可。

当遇到类似

text 复制代码
Collecting package metadata (repodata.json): failed

的报错时,建议优先检查:

bash 复制代码
conda info
conda config --show-sources
conda config --show channels

可以重点观察报错中的 Channel URL。

相关推荐
云水一下20 小时前
零基础玩转bWAPP靶场(四十五):XSS - Reflected (JSON)
web安全·json·xss·bwapp·reflected
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 天前
Spring‑AI Document 对象 JSON 字段详解
人工智能·spring·json
sunywz2 天前
【从零搭建物联网智能充电桩系统】2、自定义二进制协议:设备为什么不用 JSON?
python·物联网·json
灵析表格2 天前
灵析表格手机号处理函数深度分析报告
前端·网络·json·wps·灵析表格·excel公式盒子
猿长大人3 天前
C# | JSON 序列化中的多态接口处理:基于 Attribute 实现精准 $type 控制
c#·json
消失的旧时光-19433 天前
第六篇:Redis Hash——一个用户对象应该保存成 JSON,还是保存成 Hash?
redis·json·哈希算法
SEO_juper3 天前
2026年Schema自动注入实战:用Python批量给1000个页面加上JSON-LD,AI引用率实测提升38%
人工智能·python·json·seo·独立站
Wang's Blog3 天前
AI Agent白手起家37: LangChain 输出解析器实战:文本、JSON、XML 与 Pydantic
xml·langchain·json
灵析表格3 天前
json_ObjectToKV 函数深度研究报告
json·excel·wps·灵析表格·excel公式盒子