ARTICLE DETAIL

资讯详情

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

Jupyter Notebook从入门到实践:核心概念、操作与调试技巧

Jupyter Notebook从入门到实践:核心概念、操作与调试技巧 在实际 Python 开发、数据分析、算法实验和教学演示中Jupyter 已经成为大多数人绕不开的交互式开发工具。它是一个把代码编辑、运行结果、图形图表和说明文字放在同一个页面里的环境最大的价值不是替你把代码写对而是让你在写代码的同时立刻看到每一步执行的中间结果并且带着上下文继续思考。简单说Jupyter 解决的核心问题是数据探索和算法调试时代码不应该是一锤子买卖而应该是一段可以逐步观察、随时修改、反复执行的实验记录。这篇内容面向刚开始接触 Jupyter 的读者也适合那些已经在用 Notebook但对单元格机制、Magic 命令、内核管理和报错排查还停留在“能用但不清楚为什么”阶段的开发者。文章会围绕一条主线展开先理解 Jupyter 由哪些部件组成再完成安装和启动接着掌握 Notebook 的新建、编辑、运行、保存等基础操作然后通过一个最小示例把代码执行链路跑通最后补齐文件操作、内核管理、常见问题和工程化建议。学完之后你应该能独立安装 Jupyter、创建 Notebook、编写并运行 Python 代码、把结果导出为脚本并且能自己定位“Jupyter 启动失败”“打开后空白”“命令找不到”这几类最常见的故障。1. 先理解 Jupyter 的几个核心概念1.1 Notebook 文档不是普通代码文件很多人第一次打开 Jupyter 时会产生一个困惑我明明是在写代码为什么这个界面像一个文档编辑器这背后的核心原因是 Notebook 的存储格式不是.py而是.ipynb。.ipynb本质上是一个 JSON 文件里面记录的是单元格列表每个单元格又分为代码单元格、Markdown 单元格和 Raw 单元格。{ cells: [ { cell_type: markdown, metadata: {}, source: [# 示例标题] }, { cell_type: code, execution_count: 1, metadata: {}, outputs: [], source: [print(hello jupyter)] } ], nbformat: 4, nbformat_minor: 5 }这段 JSON 展示了.ipynb的内部结构。可以拆成几层理解顶层是cells数组数组里的每个元素就是一个单元格。单元格有cell_type字段markdown表示说明文字code表示代码raw表示原样输出内容。source字段保存单元格里的实际内容数组中的每个字符串对应一行。代码单元格还记录了execution_count也就是执行次序和输出结果。理解这一点很重要因为它决定了你操作 Jupyter 时的习惯你不是在直接修改一个 Python 源文件而是在维护一个 JSON 文档里的单元格集合。因此Jupyter 天然适合把“注释、代码、运行结果、图表”组合在一起但也因此带来了版本控制不友好、代码结构容易被乱序执行破坏等问题。1.2 单元格与内核的协作方式Notebook 里的代码单元格并不是独立运行的。所有代码单元格都共享同一个运行环境这个运行环境在 Jupyter 体系中叫做“内核”Kernel。内核可以是 Python 3、R、Julia 等不同语言解释器默认最常用的是 IPython 内核。一个单元格执行时实际发生的事情是用户在浏览器里点击运行按钮或按Shift Enter。前端把单元格代码发送给 Jupyter Server。Jupyter Server 将代码转交给当前文档绑定的内核。内核执行代码并把输出结果返回给前端。前端把输出显示在单元格下方同时In[编号]和Out[编号]会更新。这种机制解释了很多新手常见的困惑。假设先在一个单元格里执行a 10再在下一个单元格执行print(a)结果是10。这是因为两个单元格共享同一个内核的状态。如果重启内核a就不存在了。这既是 Jupyter 最方便的地方也是最容易出问题的原因单元格之间是否按照从上到下的顺序执行完全由用户负责Jupyter 不会阻止你跳过某个单元格。1.3 Jupyter Notebook 与 Jupyter Lab 的区别近年越来越多资料同时出现“Jupyter Notebook”和“JupyterLab”两个词。很多人误以为它们是两个竞争产品其实两者都是 Jupyter 官方项目。Jupyter Notebook 是最早的网页交互式界面而 JupyterLab 是对界面的重构和扩展。对比维度Jupyter NotebookJupyterLab界面形态单一 Notebook 页面为主多标签页、多面板工作台文件拖拽较弱支持从系统文件管理器拖入文件多文件并行编辑可以但标签管理较弱同一窗口可同时打开多个 Notebook、文本文件、终端插件生态有限更丰富适合场景教学演示、简单脚本实验项目开发、数据处理、日常多任务工作流按实际项目经验来看刚开始学习可以考虑 Notebook因为它界面更简单路径更短但一旦进入真实项目开发JupyterLab 的体验通常更接近一个轻量级 IDE。两者服务的底层逻辑是一致的本文章节里提到的单元格、内核、Magic 命令等内容在 Notebook 和 JupyterLab 中的操作方式基本一致。2. 安装和启动从环境准备到第一条命令2.1 选择安装方式Anaconda 与 pipJupyter 的安装方式有两条常见路线。一是安装 Anaconda 发行版二是通过 pip 在已有 Python 环境里安装。两条路线本身没有绝对优劣核心取决于你目前是否需要 Anaconda 里附带的大量数据科学库。使用 Anaconda 时一般下载安装包后Jupyter 已经自带不需要额外执行安装命令。打开 Anaconda Prompt 或系统终端直接执行启动命令即可。如果使用纯 Python 环境则用 pip 安装pip install jupyter如果只需要 Notebook 而不需要 JupyterLab可以按需安装子包pip install notebook这里要提醒一点如果原始环境里已经有多个 Python 版本或者使用了 virtualenv、conda 等虚拟环境优先在目标虚拟环境里执行安装命令避免装错环境后启动的 Jupyter 找不到内核。安装完成后检查版本jupyter --version正常输出会列出 jupyter 核心包、jupyterlab、notebook 等版本号。如果提示jupyter 不是内部或外部命令说明 Python 脚本目录没有加入 PATH这条问题在第 6 节会专门排查。2.2 启动 Jupyter 的三种方式安装完成后启动 Jupyter 的常用方式有三种区别主要在入口。第一种命令行启动 Notebookjupyter notebook执行后终端会输出一段日志包含本机访问地址和 token同时浏览器会自动打开一个文件管理页面。默认地址通常是http://localhost:8888/tree第二种在 JupyterLab 中启动jupyter lab默认地址是http://localhost:8888/lab第三种在已经运行的服务中通过终端进入。比如在 JupyterLab 左侧打开“终端”输入jupyter notebook也可以再开一个 Notebook 服务。但日常开发不建议这样嵌套使用直接用启动命令即可。启动后建议观察终端日志确认 Server 是否正常启动。正常情况会看到类似这样的内容[I 2025-01-01 10:00:00.000 LabApp] Jupyter Server 2.x is running at: [I 2025-01-01 10:00:00.000 LabApp] http://localhost:8888/lab?tokenxxxxxxxx如果浏览器没有自动弹出直接把日志里的地址复制到浏览器访问即可。2.3 启动后如何切换到指定工作目录Jupyter 打开后显示的文件列表默认来自启动命令时所在的目录。很多新手第一次启动时发现找不到自己的项目文件夹原因就是这个。有两种调整目录的方式。一种是在启动命令中直接指定jupyter notebook --notebook-dir/path/to/your/projectjupyter lab --notebook-dir/path/to/your/projectWindows 下路径建议写成jupyter notebook --notebook-dirD:\projects\jupyter_demo另一种是在界面上切换。JupyterLab 左侧文件浏览器可以导航到任意目录Notebook 界面则更依赖进入目录之后再启动服务。因此实际项目里推荐在项目根目录打开终端再执行启动命令把项目目录作为服务器工作目录。2.4 验证 Jupyter 是否可用启动完成后新建一个 Notebook在代码单元格里输入import sys print(sys.version)执行结果会显示当前 Python 解释器的版本号。这个操作的意义不只是测试环境更重要的是确认一件事Jupyter 使用哪个 Python 环境。如果sys.executable指向的路径不是你预期的虚拟环境说明内核绑定不对后续安装的包在 Notebook 里会 import 不到。import sys print(sys.executable)在排查包导入失败时这两行代码是最快的定位方式。3. Notebook 基础操作新建、编辑、运行、保存3.1 新建 Notebook 与文件命名在 Jupyter 文件列表页面点击“New”或“Python 3”按钮即可新建 Notebok。新文件默认名是Untitled.ipynb可通过“File - Rename”重命名。命名建议遵循几条原则不使用中文和空格避免部分系统和工具链处理路径时报错。文件名使用小写短横线风格例如>## 数据分析步骤 1. 读取数据 2. 检查缺失值 3. 绘制分布图公式示例$y ax b$渲染后说明文字和代码结果会交替出现在页面里这也是 Notebook 适合教学演示的原因。3.3 单元格编辑与执行机制Notebook 提供两种编辑状态命令模式和编辑模式。理解这两种模式是提高操作速度的关键。命令模式单元格边框是蓝色按键用于操作单元格本身。按Enter进入编辑模式。编辑模式单元格边框是绿色按键用于编辑当前内容。按Esc回到命令模式。常用快捷键组合如下操作快捷键运行当前单元格并移动到下一个Shift Enter运行当前单元格但不移动Ctrl Enter在当前单元格上方插入单元格Esc后按A在当前单元格下方插入单元格Esc后按B删除当前单元格Esc后连按D D剪切、复制、粘贴Esc后按X、C、V重启内核00或菜单 Kernel - Restart在练习时建议先刻意使用Shift Enter运行形成一个“写完一行立刻执行一行”的节奏。3.4 保存、自动保存与检查点Jupyter 默认会自动保存 Notebook间隔时间可以在设置里修改。同时保存动作会生成一个检查点检查点相当于一份可回滚的快照。如果某次误删了大量单元格可以通过“File - Revert Notebook to Checkpoint”恢复到上一个保存点。这里要注意Notebook 的自动保存保存的是.ipynb文件而代码单元格创建的各种变量、文件、模型结果不会自动保存。生产环境中如果训练过程很长应额外把关键结果写到磁盘而不要只依赖 Notebook 输出。4. 用代码单元格完成第一份数据探索4.1 核心库导入与内联绘图设置进入数据探索场景时最常用的核心库是numpy、pandas和matplotlib。如果没有安装可以在终端执行pip install numpy pandas matplotlib在 Notebook 第一个代码单元格里推荐先集中导入库并设置内联绘图import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline%matplotlib inline是 Jupyter 特有的 Magic 命令作用是让 matplotlib 生成的图片直接显示在单元格输出区域而不是弹出独立窗口。这是 Notebook 环境下常用的标准写法。4.2 一个最小可复现示例为了说明 Notebook 的执行链路下面构造一个极简数据示例生成一组随机数计算均值绘制折线图。np.random.seed(42) x np.arange(1, 11) y np.random.randint(1, 100, size10) print(x:, x) print(y:, y) print(mean of y:, np.mean(y))执行后输出区域会直接显示x: [ 1 2 3 4 5 6 7 8 9 10] y: [52 93 15 72 61 21 83 87 75 75] mean of y: 63.4接着在下一个单元格画图plt.plot(x, y, markero) plt.title(Random Data) plt.xlabel(x) plt.ylabel(y) plt.show()此时页面里会出现一张图片。整个过程体现了 Jupyter 的价值数据生成、打印、绘图分别在不同单元格执行每步输出都能直接看到。4.3 单元格输出的几种形式很多新手会有疑问为什么直接写一个变量名会显示结果而用print也会显示结果但有时却什么都不显示这里的关键是 Jupyter 对最后一个表达式做了自动显示。例如y执行后单元格下方会显示array([52, 93, 15, 72, 61, 21, 83, 87, 75, 75])如果把y赋值后没有单独写变量名也没有print那么就不会有输出。比如z y * 2这个单元格没有输出但z变量已经进入内核。理解这一点可以避免误以为“代码没执行”。4.4 把当前 Notebook 导出为 .py 文件虽然 Notebook 的编辑单元是单元格但在很多情况下你需要一个纯 Python 脚本文件。比如代码审查、定时任务、部署到服务器时.ipynb都不合适。导出方式有两种。第一种用菜单栏File - Export Notebook As - Export Notebook to Executable Script第二种使用jupyter nbconvert命令jupyter nbconvert --to script your_notebook.ipynb执行后会生成同名.py文件代码单元格会过滤掉 Markdown 说明。这个脚本不能保证从上到下顺序执行后逻辑完全正确因为 Notebook 里可能存在被跳过或顺序调整过的单元格。所以导出后需要从头运行一遍验证。5. Magic 命令与命令行操作提高效率的关键5.1 %timeit 和 %%time 做性能观察Jupyter 提供了一批以%开头的 Magic 命令用来处理常规 Python 代码无法直接完成的任务。最常用的是性能观察。%timeit用于对单行表达式计时会自动多次运行取平均值%timeit sum(range(10000))输出的内容是类似... loops, best of 5: ... per loop的统计结果。%%time是单元格级命令用于统计整个单元格的执行时间%%time total 0 for i in range(10000): total i注意%%开头的命令必须写在单元格第一行。如果它前面有其他代码会报错。5.2 %run、%load、%writefile 操作脚本日常使用中你经常需要把 Notebook 和.py脚本互相配合。%run可以把一个 Python 脚本在 Notebook 内核中执行脚本顶部的变量会被保留到当前内核环境%run myscript.py如果需要把某个文件加载到当前单元格可以使用%load。不过更常见的做法是用%%writefile在当前工作目录下直接生成脚本文件%%writefile hello.py def greet(name): return fhello {name} print(greet(jupyter))执行后当前目录下会出现hello.py。接着用%run hello.py验证hello jupyter这种“在 Notebook 里直接创建.py文件并运行”的方式其实就是热词中经常被提到的“Jupyter 怎么创建 .py 文件”的问题答案之一。另一个答案是在 JupyterLab 文件浏览器中直接右键创建文本文件然后把后缀改成.py。5.3 系统命令! 前缀在代码单元格里使用!前缀可以执行系统命令。例如查看当前目录!pwd在 Windows 下!dir安装包也可以直接在单元格里执行!pip install requests这在临时补装依赖时非常方便但要谨慎使用Notebook 里执行的系统命令会继承当前 Jupyter 进程的环境变量如果 Jupyter 本身运行在某个虚拟环境中命令也会使用该环境的 Python。5.4 常用 Magic 命令速查表命令作用示例%matplotlib inline让图表内联显示%matplotlib inline%timeit对单行代码计时%timeit [i**2 for i in range(1000)]%%time对整个单元格计时单元格第一行写%%time%run运行外部 .py 脚本%run script.py%load把文件内容加载到单元格%load script.py%%writefile把单元格内容写入文件%%writefile out.txt!执行系统命令!pwd%whos列出当前内核中的变量%whos%reset清空内核变量%reset -f%debug进入事后调试器%debug6. 内核管理、文件定位与常见问题排查6.1 管理内核查看、安装、选择Notebook 右下角状态栏会显示当前内核名称默认是Python 3。如果需要使用不同环境的 Python需要在对应环境中安装内核。查看当前系统里的内核jupyter kernelspec list输出类似python3 /path/to/jupyter/kernels/python3如果某个虚拟环境的内核没有出现可以先激活该环境再用ipykernel安装pip install ipykernel python -m ipykernel install --user --namemyenv --display-name Python (myenv)安装后刷新 Jupyter 页面新建 Notebook 时就可以选择这个内核。这样做的目的是让 Jupyter 知道某个环境的启动命令从而在不同的解释器之间切换。如果内核意外损坏显示为不可用状态可以移除后重新安装jupyter kernelspec uninstall myenv6.2 常见问题排查顺序与处理方案无论碰到什么 Jupyter 故障都建议按下面的顺序排查确认命令是否在正确环境中执行。确认当前目录和文件路径是否正确。确认依赖版本是否匹配。确认日志中是否有明确异常。确认端口、防火墙、代理等网络设置。确认浏览器缓存和扩展是否干扰页面。下面是几个高频问题的速查表格问题现象常见原因检查方式处理建议jupyter 不是内部或外部命令Python 脚本目录未加入 PATH执行where python、python -m jupyter --version重新安装 Python 或手动加 PATH启动失败日志提示“代码 2” 或立即退出依赖损坏、端口占用、路径含特殊字符查看终端完整日志检查 8888 端口占用清理端口或指定新端口浏览器打开后空白浏览器扩展、缓存、前端资源未加载按 F12 查看 Console 网络请求强制刷新、换浏览器、关闭浏览器插件代码执行后找不到模块当前内核不是安装包的环境在 Notebook 打印sys.executable在正确环境中装包或切换内核修改代码后运行结果没变跳过变量初始化或内核状态残留重启内核后按顺序重新执行善用 Kernel - Restart Run All6.3 详细排查案例jupyter 不是内部或外部命令这个报错在 Windows 上最常见。原因是系统环境变量里没有包含 Python 的可执行文件目录导致终端找不到jupyter.exe。检查方式是先确认 Python 是否真的安装python --version如果这条命令可以执行再尝试用 Python 模块方式启动 Jupyterpython -m jupyter notebook如果python -m jupyter notebook可以启动说明 Jupyter 已安装只是终端路径配置不完整。解决方式是把jupyter.exe所在目录加入 PATH。可以用以下命令查看位置python -c import sys; print(sys.executable)在输出的同级目录下通常能找到Scripts\\jupyter.exe。把该目录加入环境变量后重新打开终端即可。6.4 详细排查案例Windows 打开后空白Windows 上 Jupyter 打开后空白常见原因有浏览器内核不兼容、旧版本 Jupyter 前端资源加载失败、代理或安全软件拦截了 localhost 请求。排查时先看页面地址栏是否正常显示localhost:8888。然后按F12打开开发者工具切换到 Console 或 Network 标签观察是否存在 JavaScript 报错。初级的处理方案依次是使用Ctrl F5强制刷新。换一个浏览器访问同一地址。关闭浏览器所有扩展后重试。把localhost改为127.0.0.1访问。如果仍然空白可以升级 Notebook 相关包后重启pip install --upgrade notebook jupyterlab6.5 如何在其他浏览器打开 JupyterJupyter 默认用系统默认浏览器打开。如果想在 Chrome、Edge 等特定浏览器中打开有几种方式。最简单的是启动后手动把终端中的 URL 复制到目标浏览器。更规范的方法是在 Jupyter 配置文件中设置浏览器启动命令。Windows 上常见做法是先创建快捷方式再把地址粘贴到浏览器中。在 JupyterLab 中可以通过“文件 - 粘贴本地路径”或直接在文件浏览器中导航路径而不依赖系统默认浏览器。这些差异不影响 Notebook 数据本身只影响打开入口。6.6 运行启动失败代码 2 的排查思路“启动失败代码 2”不是一个详细的错误信息更像是一个退出状态码。要真正定位必须看终端中 Jupyter 输出的完整日志。常见情况包括某个依赖包与当前 Python 版本不兼容导入时报错。8888 端口被其他进程占用Jupyter 尝试绑定失败。工作目录不存在或没有写权限。配置文件中存在无法解析的参数。处理方式可以按三步推进。第一步换端口启动jupyter notebook --port8890第二步使用无配置文件启动排除配置问题jupyter notebook --config第三步查看错误堆栈的末尾内容定位是哪个模块抛出的异常。如果日志里出现ModuleNotFoundError直接在对应环境中补装该模块。7. 最佳实践与扩展方向7.1 编码规范与可在开发中复用的检查清单Notebook 的灵活执行方式是一把双刃剑。为了让 Notebook 具备可复现性建议在代码块组织上遵循以下清单第 1 个单元格只放导入语句和全局配置并设置%matplotlib inline。数据读取统一放在前置单元格避免在多个位置重复读取。使用“重启内核并全部运行”验证 Notebook 是否可以从头执行而不是只依赖当前会话的变量状态。避免把密钥、密码、账号写死在单元格里改用环境变量或配置文件。代码执行耗时明显时用%%time记录时间并打印关键进度。关键中间结果使用pandas.to_csv、np.save等接口落盘防止内核重启后丢失。不要在 Notebook 里执行不可控的删除文件和破坏性命令尤其是!rm -rf等危险操作。学习环境与生产环境在这里有明显差异。学习阶段你只要保证单元执行顺序正确、图表可见即可生产阶段则要额外考虑日志、监控、权限、异常处理和版本回滚。一个 Notebook 可以作为分析和实验的起点但作为定时任务或线上脚本之前最好导出为.py文件并用正常的工程化方式重新组织。7.2 Notebook 版本管理与协作实践.ipynb是 JSON 格式直接提交到 git 时经常产生大量无效 diff。每次执行都会改变execution_count、outputs等字段这会让代码审查很难快速定位“哪一行代码被改过”。一种常用做法是使用nbstripout这类工具在提交前清除输出。安装方式pip install nbstripout在项目仓库中启用nbstripout --install团队协作时建议约定提交前尽量清空输出大文件、大模型不放进 Notebook 仓库使用requirements.txt或 conda 环境文件固定依赖版本。7.3 常见坑的集中提醒实际接触了大量 Jupyter 用户后下面几个坑反复出现的频率最高。第一个坑是依赖装错环境。在系统 Python 里pip install pandas然后打开 Jupyter 后import pandas失败。原因是 Jupyter Server 也许运行在同一个系统 Python但 Notebook 使用的内核可能是另一个虚拟环境。排查方式是用sys.executable确认解释器路径而不是在终端和 Notebook 里反复重装。第二个坑是执行顺序混乱导致结果不可复现。写 Notebook 时常常先画图再回头补数据加载单元格结果当前会话里可以运行但是重启后报错。解决办法是开发过程中频繁执行“Restart Run All”确保文件能从头到尾独立运行。第三个坑是 markdown 单元格误写成代码单元格。切换类型后忘记了按Shift Enter导致Python解释器收到## 标题这种语法报错。解决办法是看单元格边框和右上角标签代码单元格显示“Code”Markdown 显示“Markdown”。第四个坑是长时间运行的 Notebook 被自动保存打断。自动保存本身不会终止代码但如果内核崩溃或浏览器关闭未落盘的结果会丢失。因此长任务最后要有写文件动作并把重要中间结果持续保存。7.4 下一步扩展方向掌握基础操作之后可以沿着几个方向继续深入。第一个方向是 Jupyter 与远程服务器配合。在一台没有图形界面的服务器上启动 Jupyter通过 SSH 端口转发后访问这会引出端口、token、HTTPS 等更多问题。第二个方向是 nbconvert 的自动化导出版可以把 Notebook 批量转为 PDF、HTML、Markdown用于报告生成。第三个方向是内核原理。理解 Jupyter 客户端、服务端、内核之间的通信协议之后就可以为 R、Julia、C 等其他语言接入 Notebook 环境。第四个方向是使用扩展工具。比如jupyterlab-git提供图形化 git 操作jupyter-resource-usage显示内存和 CPU 占用。对数据分析和算法实验来说这些扩展能明显提升维护体验。回到最开始的问题Jupyter 并不是一个简单的“写代码网页”而是一个把代码编辑、执行、展示、说明整合在一起的交互式工作环境。基础操作只是入口真正有价值的是你如何在它的灵活性和工程可重复性之间找到平衡。建议从今天这篇内容里的最小示例开始把新建、运行、Markdown、Magic 命令、内核管理都亲手敲一遍然后再尝试把自己手头的一个数据处理任务放进 Notebook 中完成。
返回列表