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)
- [4.1 用 `sed` 修改配置](#4.1 用
- [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。具体步骤:
- 先清理 Conda 的索引缓存:
bash
conda clean --index-cache -y
- 然后创建环境:
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 文本编辑器 对该文件进行修改,其可视化界面中编辑等操作更简单、更加用户友好。
- 使用 Gedit 文本编辑器进行文本编辑的方法可以参见我的这一篇文章中的相关内容:Linux系统中切换CUDA版本的完整指南(含vim使用方法);
- 安装 Gedit 文本编辑器的方法可以参见:Linux系统下安装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 软件源。
- 临时解决方法:
bash
conda create -n mapanything python=3.12 pip -y \
--override-channels \
-c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- 永久解决方法:
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。