ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows下Anaconda安装d2l的PermissionError问题排查与解决

Windows下Anaconda安装d2l的PermissionError问题排查与解决 前阵子帮一个读者排查环境问题他在Windows上装d2l库跟着官方文档敲了几条命令结果冒出PermissionError: [WinError 5] 拒绝访问卡到怀疑人生。这个报错在Windows用户里出现频率极高而且报错信息特别有迷惑性它不会直接告诉你“你没有权限”而是甩给你一句error loading d:\users\ww117\anaconda3\...搞得人一头雾水。这篇文章就把我在Windows下用Anaconda装d2l库的全部经验写出来包括为什么官方命令在你电脑上会挂、PermissionError到底是怎么来的、怎么一步步排查和解决以及装完之后的验证方法和后续坑。给正在学《动手学深度学习》的朋友做个参考能少走很多弯路。1. d2l入门这个库解决什么问题Windows环境真正的难点在哪1.1 d2l不是深度学习框架它是“教材配套工具包”很多人第一次见到d2l这个库会误以为它是个深度学习框架其实不是。d2l全称Dive into Deep Learning是《动手学深度学习》这本书的官方配套库作者把它做成了Python包主要用来封装书里反复用到的工具函数比如加载数据集、训练模型、做可视化、计算精度等。你不用每次翻开课本就手动抄一遍那几十行样板代码直接from d2l import torch as d2l就能用。这个库的实际使用场景很明确你在学《动手学深度学习》、跟着书里的代码敲的时候会用到它。书里有PyTorch、TensorFlow、MXNet三个版本d2l库也对应了三个入口d2l.torch、d2l.tensorflow、d2l.mxnet。所以安装d2l之前你电脑上必须先有一个深度学习框架最常见的是PyTorchPython版本也不能太老官方一般建议Python 3.8以上。1.2 Windows上装这个库为什么会比Linux、macOS更折腾如果你只用过Windows可能觉得装个Python库本来就这么麻烦。但对比Linux和macOS用户Windows的坑确实要多出好几个档次。核心原因有几个第一Windows的权限模型和Unix系完全不同。Linux下Python包一般装在用户目录或者虚拟环境目录用户是目录的主人写文件基本畅通无阻。Windows下的用户目录、Program Files目录、系统目录都有独立的文件系统权限控制尤其是Program Files和C盘根目录这类受保护位置普通权限的进程想往里写东西会被系统直接拦截。第二Windows的杀毒软件实时防护Windows Defender或者其他第三方安全软件会对Python进程的文件操作做扫描。尤其当你通过conda或pip安装包时会在短时间内批量创建和重命名大量文件实时防护很容易把某些操作判定为可疑行为然后拦下来表现形式就是PermissionError。第三文件占用问题在Windows上特别突出。你开着一个Jupyter Notebook、一个Python交互式解释器或者PyCharm里的Python进程它就会锁定相关文件。这时候conda或者pip想去更新、删除这些文件Windows会拒绝访问报WinError 5或者WinError 32。所以你在Windows上遇到的PermissionError很多时候根本不是“你真的没有管理员权限”这么简单而是杀毒软件、文件占用、路径权限三件事搅在一起。理解这一点后面的排查才能精准下手。2. Anaconda环境准备装对版本、建好虚拟环境后面才能少折腾2.1 安装Anaconda本身就要注意的细节很多人第一步就栽在Anaconda安装上。下载建议直接走清华镜像站的Anaconda安装包不要跑去官网慢慢拖。安装的时候有几点要刻意注意一下安装路径选一个纯英文、不带空格的目录比如D:\Anaconda3别装到C:\Program Files\Anaconda3也别往带中文的路径里面装。d2l这个库本身还好但PyTorch、CUDA以及后续其他库对中文路径的支持实在不敢恭维。安装界面里有一步会问要不要把Anaconda加入PATH环境变量。第一次装的人可能拿不准。如果你主要是自己使用Anaconda Prompt这一步可以勾选也可以不勾选然后以后全程用Anaconda Prompt。如果选了系统命令行里就能直接敲conda命令但要付出代价——Windows下配置好的Python解释器可能和系统里自带的其他Python版本打架。我个人的建议是把“Add Anaconda3 to my PATH environment variable”勾上后面用起来方便至于乱七八糟的路径问题在虚拟环境里操作就能规避掉。安装过程如果遇到杀毒软件弹窗记得选择允许。踩过一次在安装过程中报错、装完conda命令找不到的坑最后发现是安软把核心exe隔离了。2.2 创建独立虚拟环境为什么我不建议直接在base环境里装Anaconda自带一个base环境很多人图省事直接在base环境里pip install d2l这是我很不建议的做法。深度学习相关的库依赖非常重PyTorch又经常需要特定版本的numpy、pillow等配套包。你直接在base环境里装今天装d2l明天装个别的库很可能就把某个依赖给顶掉了然后一堆已有环境的程序开始报错。标准做法是给d2l单独建一个虚拟环境命令是这样的conda create -n d2l python3.9 -y conda activate d2l参数说明一下-n d2l是虚拟环境的名字你起什么都行我习惯用d2l见名知义。python3.9是指定创建环境时的Python版本不指定的话conda会按照当前默认Python版本来。为什么强调3.9根据我实际的踩坑经历d2l搭配Python 3.9到3.11都是稳定的但Python 3.12对部分旧版本PyTorch的支持有问题也有个别依赖包编译不过。如果你不想折腾直接选3.9或3.10最稳妥。激活之后注意看命令行前面的提示符Windows下会变成(d2l) C:\Users\用户名这样你就能确定自己已经进了虚拟环境。后面所有的安装操作都要在这个状态下进行这一步是后续一切操作的基础也是新手最容易忘记检查的环节。2.3 先把conda和pip的镜像源配好后面能少一半麻烦国内网络环境下直接用默认源的下载速度很多人都体会过装Anaconda本身就慢如蜗牛更别说pip下载torch这种几个G的包。所以正式安装d2l之前我强烈建议先把conda和pip的源都换成国内镜像。conda这边可以用清华Anaconda镜像执行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这边也是用清华PyPI镜像这样后面装PyTorch和d2l的时候速度差别会非常大pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple我把这步放在装d2l之前的理由很简单先配好基础设施等一会儿真装起来发现要下载100多MB的包几秒钟就下完了体验完全不一样。如果你已经踩过下载超时的坑回去配一下源再重新跑安装命令就行。3. 按官方流程安装d2l一步步过看它具体会挂在哪3.1 官方安装命令的本来面目《动手学深度学习》官网给出的PyTorch版安装流程大致是这样的conda create --name d2l python3.9 -y conda activate d2l pip install torch1.12.0 pip install d2l0.17.5第一第二条是建环境和激活环境第三条是装PyTorch框架第四条才是装d2l库本身。注意官方文档里一般会写pip install d2l0.17.5或者直接写pip install d2l。这里有个细节新版本的d2l包0.19.x以上2023年后维护的版本在导入d2l.torch时会有一些差异老版本更稳定所以很多人还在用0.17.5。你可以版本号灵活一点但核心逻辑是框架先行、d2l随后。3.2 先装PyTorch还是直接装d2l这个顺序不能乱有个新手常踩的坑是跳过了PyTorch安装直接pip install d2l然后发现虽然包装上了一跑代码就报ModuleNotFoundError: No module named torch。这说明d2l只是个工具包真正的深度学习计算靠的是底层框架。所以我强烈建议按照“先框架、后d2l”的顺序来。但PyTorch的安装也有讲究。如果你是纯CPU环境绝大部分学书的初学者都是直接pip install torch torchvision它会自动从PyPI上拉一个CPU版本的包够用没有CUDA就没有不会影响你跑书里的代码。如果你电脑有NVIDIA显卡想用GPU加速去PyTorch官网拿对应的安装命令。这里提醒一下官网上生成的命令默认是拼了官方源地址下载速度可能会让你怀疑人生。所以即便你想装CUDA版也建议把安装源切到国内镜像再执行。我实测下来torch和torchvision这两个包加起来下载量可能超过200MB网络稳定的情况下也就一两分钟前提是源配好了。如果这一步卡住多半是网络问题优先检查镜像源是否生效而不是怀疑安装步骤。3.3 实际执行中大家最常看到的失败形态顺着官方命令走大多数人的失败是下面这几种第一种conda resolve花很久然后报错是因为conda在解析依赖时在线查询包信息网络不好的时候会超时。解决办法是先把conda源配成国内清华镜像然后执行conda clean -i清一下索引缓存再重新创建环境。第二种pip install torch时下载速度慢到无法接受或者中途断连。这基本就是源的问题用我前面说的pip config set global.index-url切到清华PyPI源然后重装。第三种装的过程中报了PermissionError表现形态是error loading d:\users\ww117\anaconda3\lib\site-packages\...\xxx.pyd PermissionError: [WinError 5] 拒绝访问。这才是标题里说的核心大坑我需要单独用一章来展开因为它和前面的网络问题、依赖问题性质完全不一样排查思路要换一套。4. PermissionError [WinError 5] 拒绝访问从现象到根因的完整排查链路4.1 先还原一下这个报错的典型现场这个报错长什么样它通常不是出现在你敲pip install d2l的执行过程中而是在安装过程中或者在安装完成后的导入阶段。常见的情况是你执行完之后提示安装成功了但当你运行python -c import d2l或者启动Jupyter Notebook开始写代码时终端里突然冒出一串error loading d:\users\ww117\anaconda3\lib\site-packages\torch\lib\asmjit.dll PermissionError: [WinError 5] 拒绝访问。甚至安装过程中pip也会报类似的错误说某个.pyd文件无法写入或者无法替换。这个报错的关键信息有几个error loading说明是一个DLL或.pyd文件加载失败。WinError 5Windows的系统错误码含义是“拒绝访问”。路径里带了你的用户名说明报错发生在你的用户目录下的Anaconda环境中。这三件事放在一起基本可以确定问题出在文件系统权限层但具体是哪个环节卡的权限就要往下查了。4.2 我的实际排查链路四步定位法我帮人排查这个问题时一般是按下面这个顺序走的你可以照着做第一步确认是否有关联进程正在占用目标文件。Windows和Linux不一样Linux下文件被占用也能照常替换删除Windows下则直接拒绝访问。如果你开着Jupyter Notebook、IPython、IDE的Python控制台这些进程会把当前虚拟环境里很多DLL和pyd文件锁住。排查方法很简单把所有Python相关的进程全部关掉包括Jupyter、PyCharm、VSCode的Python调试进程再重试安装或导入。这一步能解决相当大一部分WinError 5问题。第二步看杀毒软件有没有拦截。Windows自带的实时保护或者其他安软有时候会把Python在site-packages里创建DLL当成可疑行为拦截掉。排查方法是暂时关闭实时保护或者去隔离区看看有没有被隔离的torch、d2l相关文件。有些人把torch装完几百MB的DLL直接被隔离了马上报WinError 5。这种情况在当前很多第三方杀毒软件上特别常见。第三步确认Anaconda Prompt是不是普通权限运行。如果你之前安装Anaconda的时候选择了系统级安装并且你当前的用户在上述目录没有写权限那普通权限下pip去安装包就会失败。排查方法很粗暴右键“以管理员身份运行”Anaconda Prompt重新激活d2l环境再跑一次命令。如果成功说明就是权限不够。第四步检查conda的缓存和索引是否有问题。有时候报错不是因为你没权限而是conda或者pip的缓存文件损坏、权限错误导致反复尝试写入失败。排查方法执行conda clean -i清理索引缓存再执行pip cache purge清理pip的下载缓存然后重试。4.3 不同的根因对应的解决方案也不同根据上面四步排查结果对应方案我整理成了下面的表排查点判断依据解决方案进程占用关掉Python进程后重试成功安装/导入前先关闭Jupyter、IDE控制台等所有Python进程杀毒软件拦截隔离区有相关DLL/PYD文件或关掉实时防护后重试成功把Anaconda虚拟环境目录加入杀毒软件信任区或临时关闭实时防护当前用户权限不足以管理员身份运行后成功右键管理员身份运行Anaconda Prompt或修改Anaconda目录的用户完全控制权限conda/pip缓存损坏clean后重试成功执行conda clean -i、pip cache purge后重装包这四个方案不是逐个试到成功为止更多时候是两三个原因叠加在一起。最典型的场景是开着Jupyter装torch杀毒软件在后台扫描DLL普通权限的终端又没权限写覆盖文件三管齐下直接报错。所以我的习惯做法是——装任何深度学习库之前先关掉所有Python相关进程再以管理员身份打开Anaconda Prompt必要时临时关杀毒实时防护装完再打开。4.4 如果以上方法都试过了还是不行该怎么办有一种情况上面所有方案都试过还是报PermissionError那就要考虑是不是Anaconda的安装目录权限被改过或者Anaconda本身装得不干净。这时候我推荐的做法是直接换环境解决不必非要在当前环境里死磕。具体操作在Anaconda里重新建一个干净的虚拟环境比如conda create -n d2l_new python3.9 -y conda activate d2l_new然后在这个新环境里重新装torch和d2l。很多时候问题出在旧环境里有残留的权限错乱或文件损坏新建环境一下子就干净了。如果新环境也不行那可能是Anaconda根目录的权限本身就坏了。这时候我会建议备份你的环境配置文件然后卸载重装Anaconda装到完全英文的路径下比如D:\Anaconda3。装完后立刻以管理员身份打开Anaconda Prompt验证一下conda命令是否正常再创建虚拟环境。根据我的经验这样能解决90%以上反复出现的WinError 5问题。5. 装完不算完验证环境、跑通第一个训练示例的后续坑5.1 怎么判断d2l真的装好了很多人看到pip提示Successfully installed d2l-0.17.5就以为万事大吉实际上装没装好要看能不能成功导入。在激活了d2l环境的终端里执行python -c from d2l import torch as d2l; print(d2l.__version__)如果能正常输出版本号说明d2l的核心导入链没问题。如果报错是找不到torch说明前面框架没装好回去重新装PyTorch。如果报错是DLL加载失败大概率就是上一章说的权限或杀毒问题。导入成功只是第一步。我建议再跑一个最简单的示例代码验证CPU版PyTorch能正常做计算避免一进notebook发现底层库不兼容import torch from d2l import torch as d2l print(torch.__version__) print(torch.tensor([1.0, 2.0]).sum())正常情况下这里会输出torch版本号和tensor的计算结果。到这一步你的环境就真正可用了。5.2 第一次运行代码时的经典坑数据集下载失败环境配好之后跟着书里代码走还会遇到一个新的高频坑数据集下载不了。比如你跑线性回归或softmax回归的示例时d2l会把数据从网上下载到本地保存路径一般是用户目录下的.d2l文件夹Windows下通常是C:\Users\你的用户名\.d2l。如果你在执行train()之前因为网络问题下载超时或者从GitHub拉数据失败会直接报URLError。解决办法有三个思路。第一个是手动下载数据集文件放到.d2l\data目录下第二个是换一个下载速度更快的网络环境第三个是如果数据是放在d2l库的服务器上通常会跟着包走不是每次都从网络拉。多数情况下你会遇到的是从GitHub下载失败那就只能找可靠的下载方式然后把文件放到正确位置。这里我不展开讨论网络工具相关话题只提示一点下载数据集的URL在d2l库源码里是写死的你可以先找一台网络正常的机器把数据下好再拷贝到目标机器的.d2l目录下这样最省事。5.3 Jupyter Notebook的内核选择问题另一个装了d2l却容易忽略的问题是Jupyter Notebook的内核。如果你在base环境下启动Jupyter然后打开notebook时没有选择d2l内核代码里虽然能导入d2l但用的是base环境的Python解释器会报一堆找不到包的错误。正确做法是在d2l环境里安装并启动notebookconda activate d2l pip install jupyter jupyter notebook或者在已有Jupyter里添加一个当前环境的内核conda activate d2l pip install ipykernel python -m ipykernel install --user --name d2l --display-name d2l这才是我说的“装完不算完”的重点。很多人环境配好了、代码也装了、Jupyter也能打开结果每次运行都报找不到模块十有八九就是内核没切换对。我在实际使用中最常做的操作就是每次打开notebook先看一眼右上角内核名是不是d2l养成习惯会有用得多。5.4 一个小技巧把常用依赖一次性装齐最后分享一个小技巧。d2l库对matplotlib、pandas这些依赖会自动安装但它不会帮你装Jupyter、ipykernel这些你自己要用的东西。所以每次建好新环境后我习惯一次性装齐常用组件conda activate d2l pip install d2l ipykernel jupyter matplotlib pandas这样后面跑书里的代码各种可视化、数据处理的依赖都有了不用中途停下来补装。装完之后记得python -m ipykernel install --user --name d2l把内核注册一下之后打开Jupyter就能直接用“d2l”这个内核省得每次手动切换。如果你在Windows上走完了上面所有流程环境大概率是稳的。我踩过几次PermissionError的坑之后现在装任何深度学习相关的库都会先确认当前在哪个环境、用的是什么权限、有没有进程占用了目录。这三件事想清楚Windows上装库的体验会好非常多。
返回列表