1. 问题背景
最近在一台 Windows 电脑上配置 PyTorch GPU 环境,希望单独创建一个 Python 3.11 的 Conda 虚拟环境,用于后续安装 PyTorch、CUDA 相关依赖。
本机已有 Anaconda,base 环境中的 Python 版本为:
text
Python 3.13.9
计划创建一个新的虚拟环境:
text
pytorchgpu
并指定:
text
Python 3.11
正常情况下,只需要执行:
powershell
conda create -n pytorchgpu python=3.11
但实际配置过程中却连续遇到了两个问题:
- Conda 镜像源返回 HTTP 404;
- 即使切换到官方源,Conda 仍然提示
python=3.11不存在。
更奇怪的是:
conda search明明可以搜索到 Python 3.11,但conda create却始终提示PackagesNotFoundError。
最终经过逐层排查,发现问题并不在 Python 3.11,也不在 conda-forge,而是主要集中在 Conda 默认求解器的求解过程。
本文记录完整排查过程。
2. 第一个问题:阿里云 Conda 镜像源失效
最开始执行:
powershell
conda create -n pytorchgpu python=3.11
出现:
text
UnavailableInvalidChannel: HTTP 404 Not Found for channel conda-forge
https://mirrors.aliyun.com/anaconda/cloud/conda-forge
Conda 当前配置大致如下:
yaml
channels:
- conda-forge
- pytorch
show_channel_urls: true
default_channels:
- https://mirrors.aliyun.com/anaconda/pkgs/main
- https://mirrors.aliyun.com/anaconda/pkgs/r
- https://mirrors.aliyun.com/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.aliyun.com/anaconda/cloud
pytorch: https://mirrors.aliyun.com/anaconda/cloud
msys2: https://mirrors.aliyun.com/anaconda/cloud
bioconda: https://mirrors.aliyun.com/anaconda/cloud
menpo: https://mirrors.aliyun.com/anaconda/cloud
channel_priority: flexible
从报错可以看出,Conda 实际尝试访问:
text
https://mirrors.aliyun.com/anaconda/cloud/conda-forge
但该地址返回:
text
HTTP 404
因此第一层问题很明确:
当前
.condarc中配置的阿里云conda-forge镜像地址已经无法正常使用。
3. 尝试绕过镜像源
为了避免原有 .condarc 干扰,可以临时指定官方源,并加:
text
--override-channels
例如使用 Anaconda 官方 main:
powershell
conda create -n pytorchgpu python=3.11 ^
-c https://repo.anaconda.com/pkgs/main ^
--override-channels
PowerShell 中实际可直接写为一行:
powershell
conda create -n pytorchgpu python=3.11 -c https://repo.anaconda.com/pkgs/main --override-channels
结果虽然已经能够正常下载:
text
Collecting package metadata (repodata.json): done
但随后却出现:
text
Solving environment: failed
PackagesNotFoundError: The following packages are not available from current channels:
- python=3.11
这就比较奇怪了。
因为 Python 3.11 显然不可能已经从官方仓库中完全消失。
4. 换成官方 conda-forge,仍然失败
进一步完全绕开阿里云镜像,直接使用官方 conda-forge:
powershell
conda create -n pytorchgpu python=3.11 -c https://conda.anaconda.org/conda-forge --override-channels
结果仍然是:
text
Collecting package metadata (repodata.json): done
Solving environment: failed
PackagesNotFoundError:
- python=3.11
到这里基本可以排除一个简单结论:
问题已经不只是"阿里云镜像失效"。
因为此时已经直接访问官方 conda-forge。
5. 最关键的一步:先不要创建环境,直接搜索 Python 3.11
这个排查思路非常重要。
conda create 同时涉及:
- 仓库索引读取;
- 包版本查询;
- 依赖求解;
- 环境创建。
因此如果直接运行 conda create,很难确定究竟是哪一层出了问题。
于是改用:
powershell
conda search "python=3.11" -c https://conda.anaconda.org/conda-forge --override-channels --repodata-fn repodata.json --no-repodata-use-zst
结果成功列出了大量 Python 3.11 版本:
text
python 3.11.0
python 3.11.1
python 3.11.2
python 3.11.3
...
python 3.11.14
python 3.11.15
python 3.11.16
例如:
text
python 3.11.16 hb12b558_0_cpython conda-forge
这一步极其关键。
它说明:
text
conda-forge 官方源正常
↓
Windows win-64 包正常
↓
Python 3.11 包真实存在
↓
本机网络正常
↓
Conda 能够读取仓库索引
换句话说:
PackagesNotFoundError并不是真的意味着仓库里不存在 Python 3.11。
问题应该发生在:
text
Solving environment
这一阶段。
6. 尝试固定 Python 3.11.16,依然失败
既然搜索结果已经明确显示:
text
Python 3.11.16
存在,那么进一步指定准确版本:
powershell
conda create -n pytorchgpu python=3.11.16 -c https://conda.anaconda.org/conda-forge --override-channels --repodata-fn repodata.json --no-repodata-use-zst
结果仍然:
text
Solving environment: failed
PackagesNotFoundError:
- python=3.11.16
此时问题就更加明确了:
text
conda search
→ 能看到 Python 3.11.16
conda create
→ 却说 Python 3.11.16 不存在
因此已经基本可以判断:
问题发生在 Conda 创建环境时的依赖求解阶段,而不是包本身不存在。
7. 排查是否存在隐藏的 Conda 限制
在怀疑 solver 之前,还可以检查几个 Conda 配置。
7.1 检查是否只允许旧 .tar.bz2 包
执行:
powershell
conda config --show use_only_tar_bz2
结果:
text
use_only_tar_bz2: None
说明没有显式限制 Conda 只能安装旧格式包。
7.2 检查是否锁定了 Python 版本
执行:
powershell
conda config --show pinned_packages
结果:
text
pinned_packages: []
说明没有类似:
text
python=3.13
这样的全局版本锁定。
7.3 检查创建环境时是否自动加入额外软件包
执行:
powershell
conda config --show create_default_packages
结果:
text
create_default_packages: []
说明 Conda 在创建新环境时没有自动加入其他默认包。
因此以下三个常见原因均被排除:
text
use_only_tar_bz2 → 无异常
pinned_packages → 空
create_default_packages → 空
问题进一步集中到:
Conda solver。
8. 最终解决方案:切换为 classic solver
最终执行:
powershell
conda create -n pytorchgpu python=3.11.16 -c https://conda.anaconda.org/conda-forge --override-channels --solver=classic --repodata-fn repodata.json --no-repodata-use-zst --no-pin --no-default-packages
其中最关键的是:
text
--solver=classic
另外几个参数分别用于最大限度减少其他配置干扰:
text
--override-channels
只使用本次指定的 channel。
text
--repodata-fn repodata.json
明确使用完整 repodata。
text
--no-repodata-use-zst
不使用 zstd 压缩版 repodata。
text
--no-pin
忽略潜在版本 pin。
text
--no-default-packages
不自动加入默认包。
这一次结果终于变为:
text
Collecting package metadata (repodata.json): done
Solving environment: done
然后正常生成:
text
## Package Plan ##
environment location:
C:\Users\小乔\.conda\envs\pytorchgpu
added / updated specs:
- python=3.11.16
并列出了待安装的软件包:
text
python-3.11.16
pip
setuptools
openssl
tk
wheel
...
最终显示:
text
done
# To activate this environment, use
#
# conda activate pytorchgpu
至此,环境终于创建成功。
9. 为什么 --solver=classic 能解决问题?
Conda 新版本通常会使用较新的依赖求解机制。
而本次实际测试中出现了一个非常典型的现象:
text
默认 solver
↓
Python 3.11.16
↓
PackagesNotFoundError
切换:
text
--solver=classic
之后:
text
Solving environment: done
因此从本次排查结果来看:
问题高度集中在默认 solver 的求解路径,而不是 Python 3.11 本身。
需要注意的是,这并不意味着:
所有 Conda 用户都应该永久改成 classic。
而是说:
当出现"
conda search能找到包,而conda create却报PackagesNotFoundError"这种反常情况时,切换 solver 是一个非常值得尝试的排错手段。
10. 推荐的简化解决命令
如果确定自己的问题与本文类似,可以先尝试:
powershell
conda create -n pytorchgpu python=3.11 --solver=classic
如果原有 Conda channel 配置存在问题,则建议进一步指定官方 conda-forge:
powershell
conda create -n pytorchgpu python=3.11 -c https://conda.anaconda.org/conda-forge --override-channels --solver=classic
如果仍然存在 repodata 或其他配置干扰,可以使用完整版:
powershell
conda create -n pytorchgpu python=3.11.16 -c https://conda.anaconda.org/conda-forge --override-channels --solver=classic --repodata-fn repodata.json --no-repodata-use-zst --no-pin --no-default-packages
11. 如何确认环境确实创建成功
创建完成后执行:
powershell
conda activate pytorchgpu
然后:
powershell
python --version
正常应看到:
text
Python 3.11.16
还可以执行:
powershell
where.exe python
正常情况下,虚拟环境中的 Python 应该位于类似:
text
C:\Users\用户名\.conda\envs\pytorchgpu\python.exe
12. 一个很重要的排错思路:不要看到 PackagesNotFoundError 就立即换源
这次排查过程中最大的经验之一就是:
PackagesNotFoundError并不一定意味着这个包真的不存在。
例如本次:
text
conda create python=3.11.16
提示:
text
PackagesNotFoundError
但:
powershell
conda search "python=3.11"
却可以明确看到:
text
3.11.16
因此以后遇到类似问题,可以按照下面的顺序排查:
text
第一步
检查 channel 是否可以访问
↓
第二步
conda search 包名
↓
第三步
确认仓库里是否真实存在该包
↓
第四步
检查 pinned_packages 等配置
↓
第五步
切换 solver
↓
第六步
再考虑重装 Conda
而不是一看到:
text
PackagesNotFoundError
就开始:
text
换镜像
重装 Python
重装 Anaconda
重装 CUDA
很多时候这些操作其实和真正的问题没有关系。
13. 建议检查自己的 .condarc
如果之前使用过国内镜像,建议执行:
powershell
conda config --show-sources
查看 Conda 到底读取了哪些配置文件。
然后:
powershell
conda config --show channels
以及:
powershell
conda config --show
检查是否还存在已经失效的:
text
custom_channels
例如本文最开始遇到的:
yaml
custom_channels:
conda-forge: https://mirrors.aliyun.com/anaconda/cloud
如果该镜像已经无法访问,那么即使其他配置没有问题,也会导致:
text
HTTP 404
因此需要把:
"镜像源问题"
和:
"solver 问题"
分开处理。
本文实际上同时遇到了这两层问题。
14. 本次问题的完整故障链
整个过程可以总结为:
text
conda create python=3.11
↓
阿里云 conda-forge
↓
HTTP 404
↓
发现镜像源失效
↓
切换 Anaconda 官方源
↓
PackagesNotFoundError
↓
切换官方 conda-forge
↓
仍然 PackagesNotFoundError
↓
conda search python=3.11
↓
成功找到 Python 3.11.0~3.11.16
↓
证明包确实存在
↓
检查 pinned/default packages 等配置
↓
均无异常
↓
切换 --solver=classic
↓
Solving environment: done
↓
Python 3.11.16 环境创建成功
所以最终问题并不是单一原因,而是:
第一层:旧 Conda 镜像配置失效;
以及:
第二层:默认 solver 在当前环境中出现异常求解行为。
15. 总结
如果你在 Windows 下执行:
powershell
conda create -n xxx python=3.11
遇到:
text
PackagesNotFoundError
不要立即认为:
Python 3.11 不支持了。
尤其是当:
powershell
conda search "python=3.11"
能够正常找到目标版本时,就应该把排查重点放到:
text
Conda channel
Conda 配置
repodata
solver
而不是 Python 本身。
本次最终成功命令为:
powershell
conda create -n pytorchgpu python=3.11.16 -c https://conda.anaconda.org/conda-forge --override-channels --solver=classic --repodata-fn repodata.json --no-repodata-use-zst --no-pin --no-default-packages
成功标志:
text
Solving environment: done
以及:
text
python 3.11.16
至此,Python 3.11 虚拟环境创建完成。
下一步便可以继续安装 PyTorch GPU 环境。
附:本文常用排查命令汇总
查看 Conda 版本:
powershell
conda --version
查看 Conda 配置来源:
powershell
conda config --show-sources
查看 channels:
powershell
conda config --show channels
搜索 Python 3.11:
powershell
conda search "python=3.11" -c https://conda.anaconda.org/conda-forge --override-channels
检查包格式限制:
powershell
conda config --show use_only_tar_bz2
检查版本锁定:
powershell
conda config --show pinned_packages
检查默认附加包:
powershell
conda config --show create_default_packages
使用 classic solver 创建环境:
powershell
conda create -n pytorchgpu python=3.11 --solver=classic
确认 Python 版本:
powershell
python --version
确认 Python 实际路径:
powershell
where.exe python