ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Anaconda安装、conda路径与Jupyter Notebook排错

Anaconda安装、conda路径与Jupyter Notebook排错 但凡在 Windows 上折腾过数据分析收藏夹里大概率都躺着一份ananconda安装jupyter路径配置的笔记连拼写都还停留在 ananconda。我见过太多人卡在完全相同的几个地方装完 Anaconda命令行敲 python 打开的却是另一个版本jupyter notebook 敲下去浏览器转半天没反应好不容易进了界面一个 import 就甩出 DLL load failed while importing rpds。这些毛病九成不是 Anaconda 本身有坑而是路径没理顺、环境没隔离、内核没绑定这三件事叠在一起炸出来的。下面把 Anaconda 安装、conda 路径配置、Jupyter Notebook 从装到跑通、再到代码补全和 markdown 目录生成这一整条链路拆开讲刚上手的人能照着抄作业机器上已经堆了三四个 Python 的老手也能拿去收拾烂摊子。1. 别急着双击安装包先把 Python 环境这件事想清楚1.1 单装 Python 为什么越用越乱大多数人的起点都一样官网下个 Python 安装包一路下一步装完觉得万事大吉。等到第二个项目需要不同版本的库或者某个包只支持 3.8 而你装的是 3.11麻烦就来了。你会开始卸载重装或者去装第二个 Python然后把两个安装目录都塞进 PATH接着命令行里的 python 指向哪个版本就变成了一场抽奖。更糟的是 pip install 默认往 site-packages 里灌装多了以后根本说不清某个包是被哪个项目引进来的删也不敢删。这就是依赖地狱最原始的样子。问题的根子不在 Python而在于我们把解释器和项目依赖混在了一个全局空间里。一个项目要 numpy 1.20另一个项目要 numpy 1.26全局只能存在一份总有一个要报错。所以正式干活之前先接受一个观念Python 解释器本身应该是可以有很多份的每个项目用一份互不干扰。想明白这一点Anaconda 存在的意义就清楚了一半。1.2 Anaconda 到底替你接管了什么Anaconda 不是什么加强版 Python它更像一个装好了家具的公寓。核心是 conda 这个包与环境管理器外加一份预装了几百个科学计算库的 base 环境还有 Navigator 图形界面和一堆配套工具。真正值钱的是 conda 能干两件 pip 干不好的事一是同时管理 Python 版本和第三方库二是管理非 Python 的二进制依赖比如底层用 C、Fortran、Rust 写的库。第二点经常被忽略但它正是 Windows 上无数 DLL 报错的解药。pip 装的是预编译轮子wheel轮子里打包的 .dll 不一定和你系统里的运行库对得上conda 装的包则是按平台整套构建好的连 MKL 数学库、OpenSSL 这类底层件都一起给你配齐。所以在 Windows 上跑 numpy、scipy、pytorch 这类东西conda 的翻车概率明显更低。这不是玄学是构建方式决定的。代价也很直接完整版 Anaconda 装完占 3 到 5 GB包含大量你可能一辈子用不到的包。这个我们下一节再算账。1.3 完整版 Anaconda 和 Miniconda 该怎么选选哪个其实取决于你的使用习惯我列个对照表更直观对比项完整版 AnacondaMiniconda安装包体积约 900 MB 起约 80 MB装完占用3 至 5 GB400 MB 左右预装包数百个科学计算库只有 conda、python、pip首次建环境速度快很多包已有慢需要联网下载适合人群刚入门、不想折腾依赖老手、磁盘紧张、要精确控制我的实际做法是主力机器装 Miniconda教学或给别人演示的机器装完整版。新手期完整版能省掉大量装这个包报错、装那个包缺依赖的挫败感几百个预装包里有你未来一年会用到的绝大多数东西。等你开始在意环境干净程度和磁盘占用自然会转向 Miniconda。两台机器上的操作逻辑完全一致后面讲的路径配置对两者通用。2. Windows 安装 Anaconda向导里那几个勾选项才是关键2.1 安装包该从哪里拿、拿哪个版本只从官方渠道下载别去各种软件站抓绿色版精简版。那些包被谁改过、塞了什么你根本查不出来。选 64 位版本除非你有明确的 32 位需求现在几乎没有理由装 32 位。版本上有个细节值得说安装包文件名里的日期越新越好但不要迷信最新刚发布的版本。如果新版发布还不到一周遇到构建问题的概率会高一些选择上一个稳定版更稳妥。下载下来是个约 900 MB 的 .exe双击之前先确认一件事——你的安装路径里不能有中文、不能有空格、不能有特殊符号。我踩过这个坑当年图省事装在D:\我的软件\Anaconda3表面上一切正常直到某天编译一个 C 扩展报错信息里全是乱码路径折腾了两个小时才发现是中文目录惹的祸。同理用户名带中文的 Windows 账户也要留意C:\Users\张三\这种路径会让一部分工具链直接罢工。能新建一个纯英文用户就新建不能的话就把 Anaconda 装到D:\Anaconda3这种干净路径下。2.2 安装向导逐项拆解向导里有两个选择项最容易选错。第一是Just Me还是All Users。Just Me 会装到C:\Users\你的用户名\anaconda3不需要管理员权限后续更新也不容易遇到权限问题个人机器选它就行。All Users 装到C:\ProgramData\Anaconda3适合多人共用的电脑。第二是那个带红色警告的复选框——Add Anaconda3 to my PATH environment variable。官方默认不勾理由写得很明白会干扰系统里已有的 Python也可能影响其他软件。但现实是不勾的话你在命令行里敲 conda 会提示不是内部或外部命令新手当场就懵了。我的建议分两种情况机器上从没装过 Python勾上省事后面出问题的概率也不高。机器上已经装过 Python 或有其他开发工具别勾装完之后我们手动配 PATH可控性更强。2.3 装完之后的头等大事三步校验别急着重启或者打开 Navigator先在开始菜单里找到Anaconda Prompt用这个专用终端做校验。注意是Prompt 而不是 PowerShell这两个东西的行为差别后面会讲。依次执行三条命令conda --version python --version where python where conda预期结果是conda 输出一个版本号python 输出 3.x.xwhere python的第一行应该指向你的 Anaconda 安装目录下的 python.exe。如果where python冒出来两三条路径第一条还不是 Anaconda 的那说明系统里存在 Python 路径冲突这活儿我们放到下一章专门处理。这里有个习惯值得养成任何时候怀疑环境不对先跑 where python 和 where conda。这两条命令输出的路径顺序就是命令行实际会选中的顺序比看环境变量面板直观得多。3. 路径配置PATH、conda init 与 .condarc 三件套3.1 手动配系统环境变量的完整流程没在向导里勾 PATH 的人现在补上。右键此电脑→ 属性 → 高级系统设置 → 环境变量在用户变量里找到 Path双击编辑新增三条D:\Anaconda3 D:\Anaconda3\Scripts D:\Anaconda3\Library\bin三个目录各有分工缺一不可根目录提供 python.exeScripts 提供 conda.exe 和各种命令行工具Library\bin 提供 .dll 和 exe 形式的底层依赖。只加前两个、漏掉 Library\bin 是个经典错误症状是 import 某些包时报莫名奇妙的 DLL 加载失败。顺序也讲究。尽量把 Anaconda 的三条路径放在列表靠前的位置否则系统里原有的 Python 会抢先被命中。如果你不确定顺序把这三条挨个上移到最前面即可。改完之后必须重开命令行窗口旧窗口读的是老环境变量。这一点很多人栽过明明配好了敲 conda 还是不认识其实就是没重开终端。3.2 conda init 到底改了什么近几年的 conda 版本推了一套新机制叫 conda init。它做的事情是往你的 shell 配置文件里写入一段初始化脚本让 conda 的激活命令能够生效。在 PowerShell 里执行conda init powershell它会改写 PowerShell 的 profile 文件一般位于Documents\WindowsPowerShell\profile.ps1。执行完这次之后PowerShell 和 CMD 才真正具备 conda activate 的能力。不做这一步的表现是conda 命令本身能用但一执行conda activate myenv就报CommandNotFoundError还是老版本那种需要先跑 activate.bat 的状态。PowerShell 这边还有个附加剧情。如果它提示脚本执行策略被禁止需要执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser这个策略调整只作用于当前用户属于常规操作。改完之后重开 PowerShell命令行提示符前面会出现(base)字样说明初始化生效了。注意如果你同时用 CMD、PowerShell、Git Bash 三个终端conda 的初始化是分开做的。在 PowerShell 里 init 了不代表 CMD 也能用反之亦然。多终端用户建议每个都跑一遍 conda init。3.3 多环境的路径优先级与 base 自动激活conda 的激活逻辑是后激活的覆盖先激活的PATH 里的顺序是动态生成的。执行conda activate py311之后PATH 最前面会插入envs\py311及其配套目录退出时再还原。这套机制你不需要手动维护但有一个开关值得关掉conda config --set auto_activate_base false默认情况下每次开终端都会自动激活 base 环境这意味着你敲的任何 python、pip 命令默认作用在 base 上。一旦手滑在 base 里装了东西污染的是整个基础环境清理起来非常麻烦。关掉自动激活需要时手动 activate是更克制的用法。我见过太多人 base 环境装了几百个包最后只能整个重装 Anaconda。一个环境如果长期只有一个项目用也可以不激活直接用绝对路径调用它的解释器D:\Anaconda3\envs\py311\python.exe script.py在写批处理、做定时任务、配置 IDE 解释器的时候这种绝对路径法比激活更可靠因为它不依赖当前 shell 的状态。3.4 .condarc 与镜像源配置conda 的配置文件叫 .condarc一般放在用户主目录下。可以先用命令生成一份默认的conda config --set show_channel_urls yes这会创建 .condarc 文件。show_channel_urls打开之后每次装包都会打印包的具体来源地址排查到底从哪个源装的时非常有用。我强烈建议保持开启状态多一行输出少很多悬案。至于镜像源思路是把默认渠道替换成网络可达性更好的镜像配置片段大致长这样channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud ssl_verify: true需要注意的是镜像同步存在延迟最新发布的包在上面可能还没有。遇到明明官方有、镜像装不上的情况临时加-c conda-forge或切回默认源就好。还有一点镜像源配置和 pip 的配置是两套东西pip 的镜像要写在自己的 pip.ini 里位置在C:\Users\用户名\pip\pip.ini别搞混。4. Jupyter Notebook 的安装、启动与内核绑定4.1 用 conda 装还是用 pip 装base 环境里其实已经带了 Jupyter但我不建议在 base 里用它。正确姿势是先建一个专门的环境conda create -n jupyter-env python3.11 conda activate jupyter-env conda install jupyter notebook用 conda 装的优先理由是依赖一致性jupyter 依赖的 tornado、pyzmq、nbformat 这套东西版本咬合很紧conda 会一次性解算出兼容组合pip 则可能给你装上一个 tornado 新版本导致内核连不上。如果你确实只能用 pip那就先pip install --upgrade pip再pip install notebook并且装完之后别再随手升级依赖那是最容易拆掉自己房子的操作。4.2 启动命令、端口和工作目录最朴素的启动方式是在目标目录下开终端敲jupyter notebook它默认监听 127.0.0.1:8888自动打开浏览器。实际使用中我会加几个参数jupyter notebook --no-browser --port8899 --notebook-dirD:\work\notebooks--no-browser适合你习惯自己控制浏览器的情况--port在 8888 被占用时很有用Windows 上 8888 被别的进程占住是常事--notebook-dir明确指定工作根目录比每次 cd 过去省事。关于工作目录有个高频困惑启动时在哪个目录敲命令根目录就是哪个。所以很多人找不到自己的文件其实是启动目录变了。如果你用的是 Anaconda 快捷方式启动它会固定跑到默认目录去这也是重装 Anaconda 之后老文件突然消失的常见原因——文件没丢只是根目录换了。想固化启动参数就生成配置文件jupyter notebook --generate-config它会输出一个路径通常是C:\Users\用户名\.jupyter\jupyter_notebook_config.py。打开这个文件搜索root_dir或在新版里的ServerApp.root_dir取消注释并填上你的目录c.ServerApp.root_dir rD:\work\notebooks注意字符串前面的那个rWindows 路径里的反斜杠不转义这个细节能让一堆配置写了不生效的问题消失。4.3 把 conda 环境注册成 Jupyter 内核这是多环境用户最容易漏的一步。你建了 py311、py38 两个环境各自装好了 jupyter但打开 notebook 之后新建笔记本看到的只有 Python 3 一个选项选它跑的永远是你启动 jupyter 的那个环境。解决方案是给每个环境装 ipykernel 并注册conda activate py311 conda install ipykernel python -m ipykernel install --user --namepy311 --display-name Python 3.11执行完再用jupyter kernelspec list检查应该能看到 py311 列在里面。这样在 notebook 界面的 Kernel → Change kernel 里就能切换。判断当前笔记本用的哪个内核看右上角显示的名字最快别靠猜。顺带说一个清理场景环境删了但内核注册还在切换时那个名字依然挂着点了就报内核启动失败。清理命令是jupyter kernelspec remove py311。4.4 配置文件里值得改的几个字段除了 root_dir配置文件里还有几个我改过并且觉得值得的项c.ServerApp.port固定端口省得每次记。c.ServerApp.open_browser False关掉自动弹浏览器。c.ServerApp.allow_remote_access只在你有明确的局域网访问需求时打开同时要配合 token 或密码别裸奔。c.MappingKernelManager.cull_idle_timeout设置空闲内核自动回收时间长时间开着 notebook 的机器内存压力会小很多。这些字段在不同大版本里前缀会变Notebook 7 和旧版 6 的差别很大改之前先看一眼配置文件里现有的注释以文件里实际存在的字段名为准。照抄网上老教程的字段名经常遇到改了没反应原因就是前缀已经换掉了。5. 高频故障排查从打不开到 DLL load failed5.1 jupyter notebook 打不开、浏览器没反应这是被问得最多的一个。排查顺序我固定成三步。第一步看终端输出。jupyter 启动时会打印一串 URL形如http://localhost:8888/?tokenxxxx。如果终端一直停在某个位置不动或者打印了Serving notebooks from local directory之后就没了动静问题通常在浏览器这一侧——不是你网断了是默认浏览器没被正确唤起。第二步手动复制那个带 token 的完整 URL 到浏览器地址栏。注意必须带 token直接输 localhost:8888 会被要求登录而 token 就在终端里。这是网页版登录入口在哪这类问题的真正答案入口就是终端打印的那个带 token 地址。第三步如果浏览器显示无法访问此网站检查端口占用。用netstat -ano | findstr 8888看谁占着换端口重开就行。还有一种情况是杀软或防火墙拦了本地回环请求临时关掉试一次就能定位。补充一个冷门原因Notebook 7 默认不再自动打开浏览器行为变了很多老教程还写着会自动弹窗导致人误以为启动失败。终端里打印了 URL就是启动成功了。5.2 单元格执行代码没有任何反应现象很迷惑代码敲进去ShiftEnter 之后左侧的[ ]一直是空的不变成[*]也不变成[1]界面像死了一样。按可能性排序我遇到的实际情况大致是这几种现象细节大概率原因处理办法状态栏显示未连接或内核图标是空心圆内核没启动或被杀掉Kernel → Restart Kernel只有打开 notebook 时卡住别的正常上次运行留下的状态损坏关闭并重新打开文件或删除同目录下的.ipynb_checkpoints所有 notebook 都卡某个扩展与当前版本不兼容禁用 nbextensions 里的可疑扩展再试执行后立即闪回空闲单元格被设成了 Raw 或 Markdown 类型在工具栏把类型改回 Code还有一种容易被忽略的笔记本文件里存在一个死循环或者超长输出内核实际上在跑只是界面没刷新。这种情况去任务管理器看 python.exe 的 CPU 占用就能确认。遇到卡死最干脆的做法是从任务管理器结束掉所有 python 进程然后重开 notebook比在那儿等省时间。5.3 ImportError: DLL load failed while importing rpds这个报错的新版 Jupyter 用户撞上得特别多因为 nbformat 从某个版本开始把 rpds 作为依赖而 rpds 是用 Rust 写的发布的是预编译轮子。Windows 上加载失败通常是三种原因之一一是缺少系统运行库。装一遍 Microsoft Visual C Redistributable2015-2022 那个合集包解决大多数 .dll 加载问题这一步在其他 DLL 报错场景下也通用。二是轮子和 Python 版本不匹配。rpds 的轮子按 cp39、cp310、cp311 分开发布如果你的 Python 是 3.7 这种较老版本找不到对应轮子就会出问题。确认版本python --version然后用 conda 装对应构建conda install -c conda-forge rpds-py三是 pip 装了个半成品。有时候是网络中断导致轮子下了一半直接重装即可pip install --upgrade --force-reinstall rpds-py如果折腾半天就是不认还有个兜底思路把 nbformat 降到不依赖 rpds 的版本或者干脆整体用 conda 重装 jupyter 那一套。conda 装的版本组合是解算过的出现单个包加载失败的几率明显低。提示凡是看到ImportError: DLL load failed第一反应先别改代码。先确认三件事——VC 运行库装了没、Python 位数和包位数一不一致、有没有混用 conda 和 pip 装同一批依赖。这三条能覆盖绝大多数情况。5.4 中文路径、空格路径与权限的老账前面提过这里再系统说一次因为它实在太常犯。路径里带中文或空格会让一部分基于 C/C 的工具链找不到文件。症状五花八门有编译报错的有找不到临时目录的还有内核启动了但读不到文件的。解决办法只有一个把 Anaconda 安装目录、项目目录、notebook 根目录全部换成纯英文无空格路径。权限问题方面如果 Anaconda 装在 ProgramData 下All Users 模式后续conda install有时会因为写不了目录而失败报一堆 PermissionError。要么右键用管理员身份开终端要么一开始就选 Just Me 模式装在用户目录。杀软误伤也值得一提。某些安全软件对 python.exe 频繁读写文件的行为敏感会做实时拦截表现为安装特别慢或者随机失败。把 Anaconda 目录和项目目录加进白名单能省下大量莫名其妙的排查时间。这是我用过多台机器之后总结出的一条当报错毫无规律、时好时坏先怀疑杀软比怀疑代码更有效。6. 把 Jupyter 调到顺手补全、目录、导出与协作6.1 代码自动补全的几种路子原生的 notebook 补全能力比较弱Tab 键只能补出已经加载过的名字。想让它像 IDE 一样好用大致三条路第一条装 nbextensions 加 hinterland。这是老牌方案conda install -c conda-forge jupyter_contrib_nbextensions jupyter contrib nbextension install --user装完之后 notebook 首页会多出一个 Nbextensions 标签页进去把 Hinterland 勾上。效果是边输入边弹出候选不用按 Tab。它的原理是做静态补全对自己敲的变量名和导入的对象反应很快但对库内部属性的补全一般。第二条上 JupyterLab 配 LSP。补全质量更接近正经 IDE代价是装的东西多、启动稍慢遇到版本不匹配的排查成本也更高pip install jupyterlab-lsp pip install python-lsp-server[all]第三条干脆用 VSCode 连 Jupyter。这是个被低估的方案。VSCode 里装 Python 和 Jupyter 两个扩展打开 .ipynb 就能直接编辑运行补全、跳转定义、变量面板全都有还自带格式化和调试。我现在的日常组合是探索性分析用浏览器里的 notebook写正式代码切到 VSCode。两者共用同一份 .ipynb 文件不会打架。有一点要提醒nbextensions 的维护速度已经慢于 Jupyter 主干版本如果你用的是 Notebook 7很多扩展会直接失效甚至导致界面卡住。升级 notebook 大版本之前先记下自己装了哪些扩展出问题好定位。这属于典型的能用就别乱升场景。6.2 用 TOC 扩展生成 markdown 目录jupyter notebook 怎么生成 markdown 目录语法这个问题其实有两个层次的答案得先区分清楚。一个层次是语法本身在 Markdown 单元格里写# 一级标题、## 二级标题它们会被渲染成不同字号的大标题但不会自动生成可点击的目录。另一个层次是扩展生成目录装好 nbextensions 之后启用 Table of Contents (2)notebook 左侧会出现一个浮动面板把所有各级标题列成树状结构点一下就能跳转。这个用起来最省心。如果想让目录直接出现在文档内部可以手工组织写法大致是# 项目说明 ## 数据来源 ## 处理方法 ## 结论而生成可跳转链接的写法需要锚点Markdown 本身对锚点支持有限实际体验不如直接用 TOC 扩展。所以我的建议是写文档时老老实实用规范的标题层级目录交给 TOC 扩展去渲染别在单元格里手堆链接。顺带说一个文档习惯。给每个 notebook 开头加一个 Markdown 单元格写清项目名、日期、数据来源和运行依赖看起来是小事但三个月后回头看这行字能救你不少时间。我就吃过亏一个跑在半年前的分析脚本环境早换了全靠开头那段备注才回忆起来当时用的哪个环境。6.3 nbconvert 导出 HTML 与在 VSCode 里转格式要把 notebook 变成可以分享的文件用 nbconvertjupyter nbconvert --to html report.ipynb它会在同目录生成 report.html双击就能在任何浏览器打开公式和图表都能带过去。想连代码一起执行再导出加--executejupyter nbconvert --to html --execute report.ipynb --output-diroutput--execute意味着导出时会从头跑一遍所有单元格如果里面有耗时几小时的任务或者需要交互输入的操作就别加这个参数否则你会等很久然后拿到一个报错。这个参数的正确用法是配合规模可控的分析脚本导出即验证顺手还能确认整条流程没有断点。除了 HTML常用的还有--to pdf和--to markdown。PDF 需要额外的排版工具链在 Windows 上配置麻烦我一般先用 HTML 再打印成 PDF省事。Markdown 导出适合往代码仓库里塞方便做版本对比。VSCode 那条路也简单打开 .ipynb 之后右上角有导出按钮可以直接转 HTML 或者 Python 脚本也可以走命令面板里的 Jupyter 导出命令。它本质上还是调用 nbconvert只是把命令行包装成了图形操作。如果你的导出需求很固定我仍然推荐记住 nbconvert 的命令行写法因为将来放进自动化脚本的时候命令行版本可以一键复现。6.4 Notebook、JupyterLab 和 VSCode 该选哪个最后这块说点选择上的个人体会因为问的人实在多。**Notebook经典版**胜在轻、熟、扩展多看数据和调参两不误缺点是文件多了之后管理能力弱标签页开十几个就找不着北。JupyterLab界面是 IDE 化的多面板、文件树、终端、变量查看器一应俱全适合同时开好几个文件做交叉对照。它的问题是刚上手会觉得信息密度太高而且部分老扩展不兼容。VSCode强在工程化和 git、调试器、格式化工具无缝协作一个项目几十个文件的时候优势非常明显。我的组合是固定的临时探索用经典 Notebook成体系的分析用 JupyterLab需要长期维护的用 VSCode。三者共享同一套内核机制你在哪个环境里注册过内核另外两个里都能选到。关于内核这件事再补一句。不管用哪个前端真正决定代码跑在哪个 Python 里的是当前笔记本绑定的内核不是你在哪开的界面。所以遇到这个包明明装了怎么还报 ModuleNotFoundError先去看右上角的内核名再去核对那个环境下有没有装这个包。九成的装了包却用不了根因都在这一处装在了 A 环境跑的是 B 内核。我在几台机器上来回折腾这几年最深的体会是Anaconda 这套东西看似复杂真正要管的其实就那么几条——安装路径保持纯英文PATH 里只留一份 Python多环境各自注册内核改配置以文件里现有字段为准。这四条守住剩下的报错基本都能在十分钟内定位。至于技术热点里那些ananconda 拼写notebook 打不开的说法多半只是同一个老问题被换了个名字问出来而已。
返回列表