先说结论:在Windows上用Anaconda安装d2l库,90%的坑都集中在两个地方:依赖链太长,以及pip子进程权限不足。尤其是标题里那个PermissionError: [WinError 5] 拒绝访问。error loading "D:\Users\ww117\Anaconda...",几乎每个在Windows下装d2l的人都会撞上一次,这个报错看起来吓人,但本质上不是d2l这个包本身有问题,而是安装器的执行权限和路径策略出了问题。
d2l是《动手学深度学习》这本书配套的Python工具库,它封装了数据加载、模型训练、绘图等一堆常用函数,目的是让人把精力放在理解深度学习原理上,而不是每次写代码都重复造轮子。它支持PyTorch、TensorFlow、MXNet三种后端,默认安装时可能会给你拉一堆依赖。很多初学者跟着教程走,在Windows命令行里输pip install d2l,结果跑了一半直接红字报错,心态当场崩掉。这篇文章就是把我在Windows 10/11下装d2l的整个流程、踩坑点、以及PermissionError的完整解决方案写清楚,适合刚学深度学习的本科生、转行做算法的朋友,以及任何在Windows上用Anaconda管理Python环境的人参考。
1. 先说清楚 d2l 是什么,为什么在 Windows 上装它比想象中更折腾
1.1 d2l 库解决什么问题
《动手学深度学习》这本书早期版本用的是MXNet作为默认后端,后来社区主力转向了PyTorch。d2l库本身是一个轻量级的教学辅助包,里面包括了几个核心模块:
d2l.data:封装了常见数据集的下载和预处理,比如Fashion-MNIST、ImageNet的子集等。d2l.train:封装了模型训练、评估、学习率调度等流程。d2l.plot:基于matplotlib封装了可视化函数,用于绘制损失曲线、权重分布等。d2l.torch/d2l.mxnet/d2l.tensorflow:按后端区分的API入口。
正因为它是教学库,所以它依赖的第三方包非常杂:numpy、pandas、matplotlib、requests、jupyter、torch(或mxnet/tensorflow)、scipy等等。这套依赖链一拉下来,少说几十个包,任何一个环节的网络超时、权限拦截、版本冲突,都会导致安装失败。
1.2 Windows 安装 d2l 的三个核心痛点
第一,依赖链过长。pip在安装时会把所有依赖包一次拉取下来,中途只要有一个包下载超时,整个安装就会回滚,但已下载的缓存不会清理,下次装的时候可能因为缓存损坏继续报错。
第二,pip子进程权限问题。这正是标题里PermissionError: [WinError 5]的直接来源。pip安装某些包时,会调用子进程去执行一些脚本(比如编译C扩展、更新命令行入口),而Windows对Anaconda安装目录默认有严格的权限控制,尤其是装在C:\ProgramData\Anaconda3或者用户目录下的Anaconda文件夹,如果当前终端不是管理员权限,子进程创建文件时就会触发拒绝访问。
第三,软件源网络问题。默认的PyPI源、甚至conda默认源,在国内网络环境下经常超时,导致下载一半失败。这个好解决,换清华镜像源就行,后面我会给出具体命令。
注意:如果你看到的报错是
error loading "D:\Users\ww117\Anaconda\...",说明你是在安装过程中某个包的post-install script阶段挂掉了。这不是包没下载下来,而是下载完了、解压完了、准备写脚本入口时被系统拦了。
2. 动手前的准备:Anaconda、Python 版本与软件源选型
2.1 Anaconda 安装要点与路径选择
如果你还没装Anaconda,先去清华镜像站下载安装包,版本建议选Anaconda3-2024.02以后的版本,自带Python 3.11,兼容性比较稳。安装时有两个地方一定要注意:
一是安装路径不要选择默认的C:\ProgramData\Anaconda3,也不要放在带中文或空格的路径下。Windows对ProgramData目录的权限控制非常严格,普通用户没有写权限,pip子进程在那边创建临时文件时极易触发PermissionError。我的建议是直接装在D:\Anaconda3或C:\Anaconda3这种盘符根目录下的纯英文路径。
二是安装向导里有一个选项叫Add Anaconda3 to my PATH environment variable,这里我的建议是勾选,但如果你担心和系统已有的Python冲突,那也可以不勾,后面用Anaconda Prompt操作就行。个人经验,初学者还是勾上更省事,但要注意,勾选之后打开CMD,python命令指向的必须是Anaconda的Python,否则后面会出现pip装到系统Python里、conda环境里却找不到包的情况。
2.2 配置 conda 和 pip 镜像源
安装完成后,先别急着建环境,把软件源配好可以省掉后面90%的超时烦恼。
conda 换清华源的命令如下,在终端里逐行执行:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yespip 换清华源,执行:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple换源这件事,不要跳过。我见过太多人卡在Downloading xxx半天然后Read timed out,换了清华源之后,整包下载速度能提升好几倍,尤其是PyTorch那种1GB以上的大包,效果立竿见影。
2.3 不要装到 base 环境,一定要建虚拟环境
d2l库的依赖比较重,而且它的教程经常要求特定版本的PyTorch或numpy,如果你直接往base环境里怼,很容易把Anaconda自带的numpy、scipy版本搞乱,最后连conda本身都用不了。建一个干净的虚拟环境,所有依赖都隔离在里面,出问题直接删掉重建,成本极低。
打开Anaconda Prompt或者普通终端,执行:
conda create -n d2l python=3.9 -y为什么选择Python 3.9而不是3.11?因为d2l库以及它所依赖的某些包,在3.9下兼容性最稳定。虽然d2l官方声明支持3.9到3.11,但实测下来,Python 3.9几乎不会遇到版本冲突,省心。
注意:创建环境后,每次安装前都先确认自己在哪个环境里。终端命令行开头会显示
(base)或(d2l),如果显示(base),执行conda activate d2l切换过去。
3. 完整安装 d2l 的实操过程(以 PyTorch 后端为例)
3.1 创建虚拟环境并安装基础包
假设你已经按照上文创建了名为d2l的环境,接下来第一步是升级pip,这一步经常被忽略,但新版pip对依赖解析更合理,也能减少子进程报错的概率:
conda activate d2l python -m pip install --upgrade pip如果你在不该出现的阶段碰到了PermissionError,比如说官方文档压根没提但你就是遇到了,那大概率就是这里。因为pip升级的时候,需要覆盖Anaconda目录下旧版本的pip文件,权限不足时就会被拒。
接着安装Jupyter和基础依赖:
pip install jupyter matplotlib pandas scipy requests这几个包是d2l运行的基础,也可以直接等安装d2l时自动拉取,但拆开装的好处是如果某一个包下载失败,你只重试那一个就行,不用整个依赖链全部重来。
3.2 安装 PyTorch CPU 版和 d2l 库
如果你用的是NVIDIA显卡且CUDA环境已配置好,可以去PyTorch官网生成对应的安装命令。但如果你只是跟着教材学原理,CPU版足够用,安装命令也最简单:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu然后安装d2l:
pip install d2l此时大概率会看到pip开始解析一堆依赖,然后下载、安装、执行脚本。如果你运气好,一路走到Successfully installed d2l-...,恭喜你,可以直接跳到第3.3节做验证。
如果你看到PermissionError: [WinError 5] 拒绝访问。error loading "D:\Users\ww117\Anaconda...",别慌,这个就是下一节要解决的核心问题,先继续读。
装d2l的时候,它默认会安装支持所有后端的版本,包括mxnet和tensorflow的额外依赖。如果你确定只用PyTorch,可以稍微缩小安装范围,但不是必须的。个人建议直接全装,因为《动手学深度学习》有些章节会做后端对比,全装了反而省事。
3.3 导入验证与 Jupyter Notebook 内核关联
装完之后先做一次导入验证,确保环境没问题:
python -c "import d2l; import torch; print('d2l version:', d2l.__version__); print('torch version:', torch.__version__)"如果输出正常说明安装成功。接下来把当前环境关联到Jupyter Notebook:
pip install ipykernel python -m ipykernel install --user --name d2l --display-name "Python (d2l)"以后再打开Jupyter Notebook,新建内核时选择Python (d2l)就会自动使用你这个虚拟环境,不用再手动切换。
4. PermissionError [WinError 5] 拒绝访问:原因分析与完整解决方案
4.1 这个报错到底是在哪个环节出现的
先理清楚报错出现的时机,这决定了你用哪种方案解决。
第一种情况是pip安装过程中,某个依赖包下载完成后,pip会运行它自带的setup.py或post-install脚本来生成可执行入口文件。这些脚本需要向Python的Scripts目录写入.exe文件。如果你的Anaconda目录权限不允许当前用户写入,就会爆出PermissionError: [WinError 5] 拒绝访问。
第二种情况是安装时终端不是管理员权限,同时Anaconda安装目录是在C:\ProgramData或C:\Users\你的用户名\Anaconda这类受Windows UAC保护的位置。此时pip子进程执行命令时没有提升权限,写入动作被系统拦下。
第三种情况是杀毒软件(尤其是Windows自带的Defender或某些国产杀软)正在实时扫描Anaconda目录,锁定了某些正在被pip操作的文件,导致写入失败。
从报错信息里的路径D:\Users\ww117\Anaconda来看,这个用户是把Anaconda装在D盘了,这已经避开了C:\ProgramData的权限坑,但仍然出现拒绝访问,那多半就是杀软锁文件,或是pip子进程的执行上下文权限不够。
4.2 常规修复手段:管理员运行、关杀软、改路径
方法一:用管理员身份重新运行终端。
在开始菜单找到Anaconda Prompt,右键“以管理员身份运行”,然后重新执行:
conda activate d2l pip install d2l这个操作解决的是子进程权限不足的问题。用管理员运行时,pip子进程获取到的token是提升过的,写入Scripts目录不会碰到UAC拦截。实测中,这一招能解决大约五成的WinError 5问题。
方法二:临时关闭杀毒软件和Defender的实时保护。
Windows Defender的“实时保护”会锁定目录里的.exe和.dll文件进行扫描,pip写入新文件时如果被锁,就会报拒绝访问。临时关闭的路径是:设置 -> 隐私和安全性 -> Windows 安全中心 -> 病毒和威胁防护 -> 管理设置 -> 实时保护,关掉之后再去重试安装。装完后记得重新打开。如果你装的是其他杀软,同样先退出再重试。
注意:如果你用的是公司电脑或校园网环境,可能存在组策略强制开启杀毒的情况,这时候关不掉实时保护,就往下看方法三。
方法三:把Anaconda放到纯英文短路径,并放开Users目录的权限。
有些人的Anaconda虽然装在D盘,但用户目录D:\Users\ww117\Anaconda里包含特殊字符,或者目录层级太深,Windows在解析长路径时也可能触发奇怪的权限问题。建议直接装到D:\Anaconda3,然后右键文件夹 -> 属性 -> 安全 -> 编辑 -> 给当前用户勾上“完全控制”。这一步是给pip子进程一个明面上的写入许可,能解决一部分路径权限问题。
4.3 针对“子进程报错”场景的进阶解决
如果你已经用管理员身份运行、关了杀毒,仍然报error loading "D:\Users\ww117\Anaconda\...",说明问题不在权限本身,而在于pip的post-install脚本执行时,加载的某个动态链接库或依赖模块被占用或损坏。
这时候尝试下面几步,按顺序执行:
第一步,清理pip缓存。缓存里可能存着下载一半或损坏的wheel文件,重新安装时pip会优先用缓存,结果反复失败:
pip cache purge第二步,强制重装出问题的包。报错信息里通常会显示是在安装哪个包时执行的脚本,或者在报错上方有几行Running setup.py install for xxx的日志,找到那个包名,单独重装它:
pip install --no-cache-dir --force-reinstall 包名第三步,如果依然报错,可以考虑用--no-build-isolation参数避免隔离构建环境带来的权限切换:
pip install --no-build-isolation d2l第四步,终极手段:绕过pip的post-install脚本,改用conda安装d2l相关依赖。conda在Windows上的安装机制和pip不同,它不执行setup.py生成入口文件,而是直接分发编译好的二进制包,基本不会触发WinError 5。
conda install -n d2l jupyter matplotlib pandas scipy -y pip install d2l前面几个重包用conda装好,剩下的d2l本体再让pip去装,它需要执行的脚本就少很多,不容易触发权限问题。
4.4 终极兜底:把环境的 Scripts 目录权限全部放开
如果你装了很多包,不想一个一个排查,可以直接把Anaconda目录下当前环境的Scripts、Lib、DLLs三个文件夹的写入权限全部放开。具体操作:在文件资源管理器里进入D:\Anaconda3\envs\d2l,右键Scripts文件夹 -> 属性 -> 安全 -> 编辑 -> 选中“Users” -> 在“Users的权限”下方勾选“完全控制”,应用确定。Lib和DLLs文件夹做同样的操作。
这个办法确实有点粗暴,但非常有效。Windows下的权限模型比较迷,你明明已经给了当前用户完全控制,但pip子进程可能是以另一个账户上下文去执行的,直接把Users组放开,能覆盖绝大多数场景。
我线上帮人排查这个报错时,发现一个规律:凡是报错路径里出现
Users\xxx\Anaconda或ProgramData\Anaconda的,放开Scripts目录权限后基本都能解决;凡是报错路径里出现Temp\pip-...的,多半是杀软锁缓存文件,清理缓存或关闭实时保护后就能解决。
5. 装完之后常见问题速查表
5.1 六个高频问题与对应解法
| 问题现象 | 大概率原因 | 解决方案 |
|---|---|---|
pip install d2l卡在Solving environment...超时 | conda依赖解析时间过长,或源速度慢 | 用pip代替conda安装;或给conda换上清华源 |
ERROR: Could not install packages due to an OSError: [WinError 5] | Scripts目录无写权限 | 管理员运行终端,或放开环境目录权限 |
ModuleNotFoundError: No module named 'd2l' | pip装到了其他环境 | 执行conda activate d2l再验证python -c "import d2l" |
ImportError: numpy.core.multiarray failed to import | numpy版本和PyTorch不兼容 | pip install --upgrade numpy或降级numpy到1.24.x |
torch.cuda.is_available()返回False | 安装的是CPU版或CUDA版本不匹配 | 安装GPU版:卸载torch后去官网重新安装对应CUDA版 |
| Jupyter里 import d2l 成功但 import torch 失败 | Jupyter内核选错环境 | 重新执行python -m ipykernel install --user --name d2l |
第一行的“Solving environment”问题特别容易出现在conda安装大包时,我个人的经验是:凡是conda解析超过5分钟还在转圈,直接Ctrl+C取消,改用pip。pip虽然也会有依赖解析,但通常几十秒内就出结果。
第二行的OSError也就是WinError 5的不完全形态,有时pip会把它报成OSError: [WinError 5] 拒绝访问而不是PermissionError,处理思路和上文一致。
5.2 建议的排查顺序
碰到任何安装异常,先按下面的顺序排查,不要一上来就重装Anaconda:
- 确认当前激活环境是不是d2l:
conda info --envs,看有没有星号标记。 - 确认pip指向的是哪个Python:
pip --version,看路径里有没有envs\d2l。 - 查看报错信息的完整日志,不只是最后一行。往上翻10到20行,定位是在下载、解压、编译还是执行脚本时出错。
- 依次执行:管理员运行、关杀软、清理pip缓存、放开目录权限、conda+pip混合安装。
- 最后才考虑删掉环境重来:
conda deactivate && conda env remove -n d2l -y。
排查时最重要的一点是一次只改一个变量。不要同时又是管理员运行又是关杀毒又是改权限,否则就算问题解决了,你也不知道到底是哪一步起的作用,下次换台电脑照样抓瞎。
5.3 给新手的额外提示
第一次装d2l的人,还有两个容易忽略的小点:
一是不要同时开会多个终端窗口操作conda环境,多个conda进程同时访问同一个环境时偶尔会触发文件锁定,表现出来也是PermissionError,但很多人会误以为是权限问题。
二是《动手学深度学习》代码里面经常用d2l.show_fashion_mnist这类绘图函数,如果之后运行代码时提示找不到某个可视化相关的库,多半是d2l的某个额外依赖没装上,执行pip install matplotlib补一下就行,别又想着去重装整个d2l。
6. 写在后面:关于环境安装,我的一点个人体会
装d2l这件事本身不复杂,真正复杂的其实是Windows环境下Python生态的权限和路径管理。我在实际安装中踩得最多的坑,恰恰不是d2l本身的依赖冲突,而是那些看起来和Python毫无关系的系统级问题:杀毒软件锁文件、目录权限不对、终端权限不够。这些问题的共同特点是报错信息特别吓人,但解决方式往往简单得让人想笑。
所以我个人的习惯是,装完Anaconda之后第一件事就是建一个单独的虚拟环境,然后把镜像源、权限、杀毒软件相关的策略全部提前配好,而不是等报错来了再逐项排查。另外一个小技巧是,安装d2l这种依赖繁多的库时,把pip命令加上--progress-bar off,日志会清爽很多,报错时更容易定位是哪一个包出的问题。
希望这篇指南能帮你在Windows下一次性把d2l装好,少走几步弯路。如果中途碰到别的报错,建议先去pip或conda的日志文件里看一眼真实出错原因,再对症下药。环境装好了以后,真正花时间的地方就在理解深度学习本身了,祝学习顺利。