ARTICLE DETAIL

资讯详情

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

Jupyter Notebook 安装与排障全攻略:从环境配置到 DLL 报错解决

Jupyter Notebook 安装与排障全攻略:从环境配置到 DLL 报错解决 做技术这些年我见过很多人栽在 Jupyter Notebook 安装这一步上网上教程说pip install jupyter一条命令搞定结果自己敲完不是“不是内部或外部命令”就是浏览器半天不弹出来再不然装好了打开全是英文连菜单都看不懂。说实话Jupyter Notebook 的安装和使用真不难难的是很多人没搞清楚三件事你的 Python 环境到底干不干净、启动方式对不对、出了问题去哪里看日志。这篇文章我就把这些年踩过的坑和总结出的流程完整写一遍从环境准备、三平台安装、中文界面设置到日常操作、Markdown 目录生成、代码补全配置再把几个出现频率极高的报错——特别是ImportError: DLL load failed while importing rpds这种玄学问题——按排查思路逐层拆给你看。如果你正准备装 Jupyter Notebook或者已经被各种异常折腾得想卸载重来这份内容应该能帮你省下大半天的瞎折腾时间。1. 先别急着 pip installJupyter Notebook 到底解决什么问题1.1 它和普通 Python 脚本有什么本质区别Jupyter Notebook 表面上是在浏览器里写代码的工具它真正改变的是你写代码的“节奏”。平时你用 VS Code 或 PyCharm 写一个.py文件逻辑往往是写好一整段代码然后运行整个文件再跑到终端里看输出。遇到数据量大的任务你想边写边看中间结果就不得不在代码里插满print()反复重跑整个脚本——中间变量丢了、数据被覆盖了、运行到一半报错了又要从头来。Notebook 把这个过程拆成了一个个“单元格”。你可以把读取数据放在第一个单元格清洗放在第二个单元格画图放在第三个单元格然后单独执行任意一个单元格看到它的输出而不影响其他单元格。最妙的是单元格之间的变量是共享的——第一个单元格里读入的 DataFrame在第三个单元格里还能直接用。这种天然的分步执行模式特别适合探索式数据分析甚至把思路写下来、连代码带结论一起保留。1.2 什么样的使用场景才值得切到 Notebook不是所有 Python 项目都适合用 Notebook。我的判断标准很简单如果你的工作是“探索、分析、演示”Notebook 就是效率神器如果你的目标是“写一个长期运行的服务或工具”老老实实回 IDE。我举几个实际场景数据集分析读数据、清洗、统计、可视化一条龙Notebook 天然合适因为每一步的可视化结果都能直接留在页面上。教学和分享代码块、说明文字、图表、公式可以混排在同一份文档里读者按顺序执行就能复现整个分析过程。算法调试尤其是机器学习训练过程你经常要反复调整参数观察结果单元格权重的方式非常适合这种边试边看的节奏。写接口、写爬虫、部署服务这些请回到普通脚本Notebook 的分步执行反而容易让你忘记“哪些代码已经跑过”造成状态混乱。一句话总结Notebook 是“带着问题做实验”的工具不是“按既定流程生产代码”的工具。想明白这一点后面所有的使用习惯都会顺很多。2. 安装前的三选一Python 版本、虚拟环境和包管理方案2.1 方案一、二、三的取舍很多人上来就问“怎么安装 Jupyter Notebook”但其实真正值得花时间想的是“用什么方式安装 Python 环境”。我在不同电脑上试过三种方案列个表给你对比方案安装难度磁盘占用包管理体验适合人群Anaconda 全家桶低较大通常 3GB 以上conda 管理兼容性好数据分析新手、不想折腾环境的人Miniconda conda 环境中较小conda 灵活环境隔离干净有一定基础、需要多环境的用户官方 Python venv/virtualenv pip中高小完全手动但最可控开发者、已经用 pip 管理包的人如果你是第一次接触 Python我其实不排斥 Anaconda。它的安装包自带 Python、Jupyter、NumPy、Pandas 等一大票常用库装完直接就能用非常省心。但它的问题也很明显包越来越多环境越来越臃肿有些包你根本用不上还占了几 GB 空间而且 conda 和 pip 混着装包时间一长容易出现依赖冲突。如果你打算长期用 Python 做事情我更推荐 Miniconda 或者原生 Python venv。Miniconda 是 Anaconda 的精简版只带 conda 和一个基础 Python你需要什么包再单独装磁盘和心智负担都小得多。至于原生 Python venv适合已经对 pip 很熟悉的开发者后面所有依赖都靠自己用requirements.txt管理清晰度最高。2.2 为什么我不建议在一个环境里装所有东西这是我被问得最多的问题之一“老师我能不能直接把 jupyter、pandas、django、scrapy 全装到 base 环境里”技术上可以但实际维护起来会非常痛苦。Python 的第三方包之间经常存在版本依赖比如 A 包要求某个依赖的版本大于 1.0B 包却要求必须小于 2.0。如果全装在一个环境里你今天为了项目甲升级了一个包明天项目乙可能就因此启动不了。这种问题在 Jupyter Notebook 使用场景里尤其容易被放大因为 Notebook 本身只是一个壳真正干活的是底下的 Python 内核内核环境一旦乱了所有记事本都会跟着遭殃。我的习惯是每一个项目、每一类工作都单独开一个虚拟环境。比如conda create -n data python3.11建一个数据分析专用环境conda create -n web python3.11建一个 Web 开发环境。哪个环境需要装新包就在哪个环境里装互不干扰。虚拟机拆开以后因为依赖冲突导致“修好一个炸另一个”的情况基本就不会再发生了。2.3 安装前必须想清楚的三件事动手之前先把这三件事记在脑子里能帮你避开 80% 的安装坑Python 版本Jupyter Notebook 官方对 Python 3.8 到 3.12 的支持都还算宽松但如果你要搭配 TensorFlow、PyTorch 这类库就要提前查好它们对 Python 版本的要求不要装个过新的 Python 结果库全装不上。位数和架构大多数人的电脑都是 64 位安装 Python 时也要选 64 位版本。很多第三方包在 32 位环境里找不到预编译文件装的时候虽然不报错运行起来才突然给你来一个 DLL 报错。路径和用户名Windows 下建议把 Python 装到不含中文、不含空格的目录比如D:\Python311。如果 Windows 用户名本身是中文比如C:\Users\张三很多工具链偶尔会出现诡异问题最好提前创建一个英文用户目录或手动指定工作目录。3. Windows、macOS、Linux 三平台安装实战与中文界面配置3.1 Windows中文用户名和环境变量这两个坑Windows 是问题最多的平台但也是最容易说明白怎么处理的平台。如果你选择官方 Python 路线步骤大概是从官网下载 Python 3.11 或 3.12 的 64 位安装包。安装时务必勾选底部的Add python.exe to PATH这个选项不勾后面pip命令大概率找不到。安装到C:\Python311或D:\Python311这样的纯英文路径不要用默认的C:\Users\你的名字\AppData\...那种带用户名的目录。用命令行进入你想创建环境的目录执行python -m venv notebook_env notebook_env\Scripts\activate pip install jupyter这里有个重点Windows 下的python命令有时候指向的是微软商店里的一个空壳程序而不是你刚装的 Python。判断方法是启动它后看版本号和界面如果提示“请在商店中查看”说明 PATH 里排在前面的不是你的真 Python。这时候要么删掉商店里的 Python要么重新调整 PATH 顺序。中文环境相关的处理最典型的一个坑是即使你装了中文包如果工作路径里有中文某些旧版本可能依然会解析出错。建议在启动 Notebook 之前先规划好一个英文路径作为工作目录比如D:\NoteBooks后续所有文件都往里放能省掉很多乱码和文件读取问题。你可以在启动后执行pwd看看当前目录确认没有中文。3.2 macOS 与 Linux系统 Python 千万别动macOS 和 Linux 上最大的禁忌就是直接动系统自带的 Python。macOS 自带的 Python 是给系统工具用的Linux 发行版自带的 Python 可能被很多系统服务依赖你用 pip 乱装包甚至会破坏系统的稳定性。正确做法是自己重新装一个独立 Python或者直接用 Miniconda 把 conda 当作用户级工具安装。macOS 推荐用 Homebrew 的方式brew install python python3 -m venv notebook_env source notebook_env/bin/activate pip install jupyterLinux 用户如果用的是 Ubuntu/Debian可以先用 apt 安装python3-venv和python3-pip然后同样用 venv 创建环境。云服务器上装我一般习惯再加一句pip install --upgrade pip确保 pip 是最新版本避免后面安装某个依赖时因为 pip 版本太老而出幺蛾子。3.3 中文界面一条配置两种情况Notebook 本身支持多语言界面但不同版本的配置文件写法有区别。新版 Jupyter Notebook 7.x 和 JupyterLab 的配置项是c.ServerApp.language旧版 Notebook 6.x 是c.NotebookApp.language。为了保险安装完以后先执行jupyter notebook --generate-config这个命令会在当前用户目录下生成一个jupyter_notebook_config.py。然后打开这个文件把配置写在末尾c.ServerApp.language zh-CN如果你用的确实是旧版那就改成c.NotebookApp.language zh-CN保存后再启动菜单和按钮就变成中文了。有些浏览器因为缓存原因第一次打开还是英文按CtrlShiftR强制刷新基本能解决。另外个别系统上要是中文显示成方块多半是缺少中文字体装一个系统级中文字体就好和 Notebook 本身没关系。3.4 验证安装与工作目录装完别急着高兴先用这几个命令做一次体检jupyter --version jupyter kernelspec listjupyter --version会显示各组件版本jupyter kernelspec list会列出可用的 Python 内核。如果kernelspec list里是空的说明内核没有注册直接启动 Notebook 会报“No kernel”错误。解决方法是重新执行安装pip install ipykernel python -m ipykernel install --user工作目录可以在启动命令里临时指定也可以写进配置。我喜欢在命令行直接指定jupyter notebook --notebook-dirD:/NoteBooks这样每次启动都会直接打开你预先整理好的项目文件夹不用再在浏览器里一层层点进路径。4. 从启动到日常使用内核、单元格和快捷键的关系4.1 启动、登录和“网页版”其实是本地服务执行jupyter notebook后终端会先启动一个本地服务然后自动打开浏览器访问http://localhost:8888。很多人第一次看到终端里那串带token的 URL以为是乱码其实这是安全令牌。如果你是手动访问页面发现它让你输密码或 token就到终端里复制这串地址整段粘贴到浏览器即可。这里顺便说清楚一个概念大家经常搜的“Jupyter Notebook 网页版”其实不是网页版本它依然是我们本机运行的 Python 进程。浏览器只是客户端真正干活的还是终端里那个服务进程。所以你把终端关掉网页再漂亮也立刻变成“无法访问”。如果你想在局域网里让别的电脑也能打开这个页面常见做法是启动时加--ip0.0.0.0 --port8888并用jupyter notebook password设置一个访问密码。默认未设密码的状态下不要把服务直接暴露到陌生网络环境里。4.2 单元格状态的四个阶段Notebook 的单元格运行状态全部体现在左边的In [ ]编号里。理解这个你就理解了一多半的“执行无反应”问题In [ ]单元格还没执行过。In [1]单元格已经执行完成输出显示在下方编号按执行顺序递增。In [*]单元格正在执行中内核正在忙。In [1*]单元格所在的内核已经忙了很久基本可以判断为运行卡死或进入了死循环。如果你执行某个单元格后发现没有输出、也没有出现In [*]那多半不是代码问题而是浏览器或内核通信断了。这种时候别急着重启电脑先看菜单栏里的“内核”选项选择“重启内核并清空输出”问题大概率就好了。4.3 高频快捷键Notebook 的快捷键分成两种模式编辑模式和命令模式。编辑模式就是指光标正在单元格里命令模式是指焦点在单元格外部。对新手来说记住这六个就够用了快捷键作用Shift Enter运行当前单元格并移动到下一个单元格Ctrl Enter运行当前单元格但不移动Esc从编辑模式切换到命令模式A/B在命令模式下在当前单元格上方/下方插入新单元格D D在命令模式下连续按两次 D 删除当前单元格M/Y在命令模式下把当前单元格切换为 Markdown / 代码模式快捷键要刻意练一练刚开始不习惯但用两三天以后效率提升特别明显。尤其是ShiftEnter几乎所有人都靠它循环运行单元格。4.4 中文输入与运行输出在 Notebook 里写中文注释、中文变量名正常情况下都没问题。但有一个小坑如果你用的是某些输入法切到中文模式时按快捷键可能会被输入法截获导致ShiftEnter不小心打出一个换行而不是运行。我一般解决方法是写中文内容时保持在编辑模式输入完以后再按Esc回到命令模式用CtrlEnter运行这样能避开输入法抢键位的问题。运行输出中的中文乱码通常和终端编码有关。Windows 上如果启动 Notebook 的终端出现乱码可以在启动前执行chcp 65001把终端代码页切到 UTF-8再启动 Notebook就能避免一部分控制台日志乱码问题。页面本身的数据输出一般不受终端编码影响因为 Notebook 内部默认用 UTF-8 处理文本。5. 目录生成与代码自动补全Markdown 语法和扩展配置5.1 Markdown 单元格里到底能写什么Notebook 里有一种特殊的单元格叫 Markdown 单元格。简单理解你可以在里面写标题、列表、表格、公式、超链接等格式化的文本运行以后在页面里渲染成漂亮的富文本。你说“jupyter notebook 怎么生成 markdown 目录语法”本质上就是先学会在 Markdown 单元格里写标题。语法很直接# 一级标题 ## 二级标题 ### 三级标题 - 列表项一 - 列表项二 **加粗** *斜体* 行内代码 [链接文字](http://example.com)写完这些内容以后按ShiftEnter运行单元格上面就是渲染结果。注意Markdown 单元格只有运行后才会渲染如果你只是光标停在里面看到的是源码而不是排版效果。5.2 目录生成经典 Notebook 和 JupyterLab 的差别很多人问“怎么生成目录”但答案取决于你用的是经典 Notebook 还是 JupyterLab。经典 Jupyter Notebook 默认没有“目录”面板只有运行 Markdown 标题后页面顶部会出现一个“内容”下拉菜单点击可以跳转但它不是侧边栏那种常驻目录。想要完整的侧边栏目录推荐安装扩展pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user重启 Notebook 后打开一个新页面在顶部菜单里找到Nbextensions勾选Table of Contents (2)刷新页面左侧就会出现一个目录面板。这个扩展还支持在 Markdown 单元格里生成可点击的目录链接。JupyterLab 就更简单了左侧默认就有“目录”图标单击就能显示当前笔记本文档的标题结构不需要额外配置。如果你已经偏离经典版我建议直接升级到 JupyterLab 统一使用目录和文件管理体验都好很多。5.3 代码自动补全的三档开关代码自动补齐是另一个高频需求。Notebook 本身其实自带基础补全——输入变量名或函数名时按Tab会弹出补全列表。但很多人觉得“按一下才出”不够顺手想要输入时自动弹出下拉框。经典 Notebook 的做法依然是靠 nbextensions。在刚才那个Nbextensions页面里勾选Hinterland从此以后只要敲代码系统就会自动根据已加载的变量和模块给出补全建议。注意补全依赖“已加载”——如果你要补全某个库里的函数必须先把那个库import进某个已执行过的单元格。JupyterLab 用户想要更强的补全体验可以装pip install jupyterlab-lsp jupyterlab-lsp同时装好对应语言的 LSP 服务端比如python-lsp-server[all]。装完以后重启 JupyterLab代码补全、变量跳转、函数签名提示都会有体验基本追平主流 IDE。6. 高频故障排查实录打不开、执行无反应、rpds 的 DLL 报错6.1 打不开从命令到端口的排查链“jupyter notebook 打不开”这个问题原因五花八门但排查链路是固定的。第一步看命令是否真的执行成功。如果启动后终端一闪而过或者提示“jupyter 不是内部或外部命令”说明你当前激活的虚拟环境里没装 jupyter或者根本没激活环境。Windows 用户看到一个通用提示“console 窗口闪烁”你先重新打开终端执行activate命令再启动。第二步看端口是否被占用。Notebook 默认监听 8888 端口端口被占时终端会像下面这样提示The port 8888 is already in use, trying another port: 8889它会自动换到下一个可用端口但你的浏览器可能还停在旧的 8888 地址上。解决办法是看终端输出的完整 URL用那个新地址访问。第三步看浏览器是否误拦截。有些浏览器会拦截本地页面的自动打开终端里又没有弹出 URL这时候手动把终端里的http://localhost:8888/?token...整段复制到浏览器地址栏。如果以上都没问题但还是打不开那就是配置或环境损坏我建议先把当前虚拟环境里的 jupyter 卸载重装pip uninstall jupyter jupyter_core notebook -y pip install jupyter这种“重装大法”能解决掉相当多因为包文件不完整导致的启动异常。6.2 单元格执行没有任何反应先看内核状态“jupyter notebook 单元格执行代码没有任何反应”是我见过最让人崩溃的问题之一因为代码看起来没错页面也没报错就只是点了运行以后像石沉大海。我的排查顺序是先看单元格左边的In标记。如果变成了In[*]并且一直不变成In[1]说明代码在运行中只是没跑完。看看是不是有死循环或者数据量太大点击工具栏的“中断”按钮终止它。如果按了运行In都没变化说明内核和页面失去了通信。打开菜单栏的“内核” → “重启内核并清空输出”通常会恢复。如果重启也没用建议在终端里启动 Notebook 时观察日志输出看看有没有红色堆栈。如果你用的是 JupyterLab再执行一遍jupyter kernelspec list确认内核注册信息没丢。如果是浏览器插件导致页面挂起试试无痕模式或换一个浏览器打开 Notbook有时候问题就出在某个广告拦截插件莫名修改了页面脚本。还有一个小细节如果你在同一个 Notebook 里同时点了多个单元格后面的单元格不会执行而是在排队等前一个跑完。很多人以为“点了没反应”其实是前面有个大型任务堵住了执行队列。养成习惯一次只运行一个单元格观察结果再跑下一个。6.3 ImportError: DLL load failed while importing rpds 的现场复原这个报错在 Windows 上出现的频率特别高报错全文一般是ImportError: DLL load failed while importing rpds: 找不到指定的模块。rpds是一个底层数据结构的原生库很多常用 Python 包会把rpds-py作为依赖。它本身是用 Rust 写的编译成动态链接库后挂在 Python 里运行时如果加载 DLL 失败通常有几种原因。原因一rpds-py包安装损坏或不完整。最常见的解决办法是强制重新安装pip uninstall rpds-py -y pip install --no-cache-dir rpds-py为什么加--no-cache-dir因为 pip 缓存里可能存了一份损坏的安装文件每次装都是从缓存复制坏文件被反复装进来重装多少遍都没用。跳过缓存强制从源重新下载往往一步解决。原因二环境混杂conda 和 pip 搞乱了底层依赖。Windows 上如果你先用了 conda 安装了大量包又用 pip 在同一个环境里装了别的包很容易把原生扩展依赖链弄乱。解决办法是 conda 环境里优先用 conda 装conda install -c conda-forge rpds-py如果你本来就在纯 pip 环境里保持干净使用就好不要两个包管理器交叉乱来。原因三缺少系统级运行库。rpds 的 DLL 依赖 Windows 的 Visual C 运行库如果电脑里没装很多原生扩展类库都会出现类似的 “DLL load failed” 报错。去微软官网下载“Visual C Redistributable for Visual Studio 2015-2022” x64 版本安装后重启终端。原因四Python 版本或位数不匹配。如果确实是在非常旧的 Python 3.7 或 32 位 Python 里跑很多新版本的 rpds-py 根本无法兼容。这种情况我唯一的建议是升级到 64 位 Python 3.10 再试。排查的时候建议先用命令行单独测试python -c import rpds; print(ok)如果这段也报错说明确实是包或运行库问题和 Notebook 本身无关。如果这段通过但 Notebook 里报错说明你 Notebook 实际用的内核不是你当前命令行激活的环境去kernelspec list里核对一下内核路径。6.4 其他高频问题网页版、下载需求、编辑器协同下载问题如果你想“jupyter notebook 下载”某些资源最常见的其实是“想把 Notebook 导出成其他格式”。用菜单里的“文件 → 下载为”就能导出为 HTML、Markdown、PDF、Python 脚本等。浏览器“另存为”只保存了页面渲染结果不是真正的ipynb文件这点要区分开。网页版远程访问如果想让局域网内其他机器也打开你的 Notebook前面提过启动时加--ip0.0.0.0同时先设好密码jupyter notebook password jupyter notebook --ip0.0.0.0 --port8888访问时浏览器输入http://服务器IP:8888就行。在编辑器里协同很多人问“jupyter notebook nvim”其实是在问怎么让 Vim/Neovim 和 Notebook 协作。一种方案是装jupytext将.ipynb配对成.py脚本在 Vim 里编辑脚本后用控制器同步回 Notebook。如果你的目标是命令行列界面也有jupyter console这种可以直接连内核的工具。但说实话如果你想在 Neovim 里获得类似 IDE 的补全和跳转直接连内核不是最省力的路径反而把.py和.ipynb配对管理更实用代码逻辑写进py文件做测试最终成果整理进 Jupyter Notebook 输出。7. 让 Notebook 真正进入工作流多环境、输出整理与持久使用7.1 把多个项目隔离干净Notebook 用了一段时间以后你会发现最大的敌人不是报错而是“不知道自己现在到底在哪个环境里”。为了不再出现“昨天还能跑的代码今天突然 ImportError”我从一开始就用最笨的方法管理每个项目一个虚拟环境环境名直接写进项目文件夹的名称里。比如D:/Projects/sales-analysis对应conda create -n sales-analysis python3.11然后每次启动 Notebook 前我习惯先在项目目录激活环境cd D:/Projects/sales-analysis conda activate sales-analysis jupyter notebook --notebook-dir.这种做法的好处是哪怕第二天换一台电脑只要把项目目录和requirements.txt带走就能快速复现环境。切环境只需要切换终端每一个 Notebook 里import的东西一目了然不会出现“在 A 环境装完然后在 B 环境运行”的乌龙。7.2 输出整理和版本管理Notebook 文件.ipynb本质上是 JSON 格式看起来是纯文本但它会保存输出结果、执行顺序、甚至图形资源。这带来的直接影响是文件稍大一点Git 里做版本管理就会频繁产生巨大 diff文件内容不容易 diff 出代码变化。我个人的经验是把 Notebook 当成“分析草稿”而不是“最终交付物”。代码稳定以后把它整理成.py脚本放进src/目录性能和可维护性都好很多。如果你一定要用 Git 管 Notebook推荐装nbstripout或jupytext让提交时自动去掉输出结果只保留代码和 Markdown 文本版本历史的 diff 会干净得多。7.3 关于中文环境和使用效率的两点补遗第一点中文界面配置好之后不要频繁升级主版本。Jupyter Notebook 7 和 JupyterLab 的配置项、扩展方式差异很大每次大版本升级都可能导致 nbextensions 失效。我身边不少人的处理方法是明确自己用哪个版本日常使用中不看新功能就坚决不升级只在虚拟环境里创建一个专门用来测试新版本的副本。第二点浏览器推荐用 Chrome 或 Edge。Notebook 对 Firefox 其实也支持但某些扩展和快捷键在 Firefox 上的兼容性稍弱。如果你在同一个页面开了很多笔记本吃到内存是正常的建议启动前不要开太多的笔记本文件用完以后从菜单栏“文件 → 关闭并停止”彻底关掉而不是直接关浏览器标签页。标签页关掉只是把页面隐藏了内核进程可能还在内存里占资源久而久之系统就会越来越卡。最后的个人习惯这套流程我反复用了很多年从rpds的 DLL 报错到目录扩展失效几乎每一个坑都亲自踩过。要我说Jupyter Notebook 安装和使用这件事三分靠命令七分靠环境管理。很多人装坏不是命令敲错而是从来不舍得把坏掉的环境删掉重来。实际上虚拟环境删了重建的成本很低一个项目环境从创建到装齐常用依赖也就是十几分钟的事。遇到恶心报错时与其花一下午在原环境里修不如直接开一个干净环境重新来。这种果断反而帮你省下更长远的折腾时间。
返回列表