很多人第一次接触 Jupyter Notebook,都是因为要写 Python,但真正卡住的往往不是语法,而是“装不上、启动报错、文件存得乱七八糟”这类环境问题。这些年帮同事朋友处理过的安装疑难杂症,十个里有八个都能归到安装选型和启动配置上。这篇就把 Jupyter Notebook 的安装全流程、启动失败的排查思路、默认路径设置这些高频坑一次讲透,再附上几个日常使用中特别容易踩的小毛病和对应解法,希望你能少走点弯路。
1. 安装前先搞明白:你要装的到底是个什么环境
1.1 先理解 Jupyter Notebook 的运行机制
Jupyter Notebook 本质上是一个基于浏览器的交互式编程环境。你安装它,其实是往电脑里装了一个 Python 包,这个包会启动一个本地 Web 服务,默认监听 8888 端口,然后浏览器通过http://localhost:8888/tree访问到编辑界面。所有代码依旧在你的电脑上运行,网页只是编辑器、输出面板和文档展示层。
理解这一层特别重要,因为后面所有故障排查都绕着它转:
- 启动时提示端口被占用,是因为 8888 端口被其他进程占了;
- 浏览器打开空白或一直转圈,但命令行窗口没报错,多半是浏览器缓存了旧页面;
- Windows 提示“找不到指定的程序”,往往是快捷方式指向的 Python 解释器路径不存在了。
把“网页 + 本地服务 + Python 内核”这三者的关系记清楚,后面排查的时候你就不会一头雾水。
1.2 三条安装路线怎么选
常见安装方式无非三种:Anaconda、Miniconda、pip。我给身边人做推荐时一般看他的使用场景来定:
| 安装方式 | 适合人群 | 优点 | 缺点 |
|---|---|---|---|
| Anaconda | 新手、不想折腾环境、需要科学计算全家桶 | 开箱即用,自带 Python 和几百个常用数据包 | 安装包接近 1GB,占空间,后续升级慢 |
| Miniconda | 开发者、希望环境干净可控、按需装包 | 安装包几十 MB,创建环境灵活,包管理顺手 | 需要熟悉命令行操作,初次配置略多 |
| pip | 已有 Python 环境、只需要 Notebook 功能 | 一条命令完成,最轻量 | 容易污染系统 Python 环境,包依赖冲突难收拾 |
如果你拿不准选哪个,我个人的建议是:电脑空间充足、纯粹想省事,直接 Anaconda;如果你平时写代码还要兼顾不同项目、希望环境隔离,那 Miniconda 更合适。
1.3 为什么我不建议直接往系统 Python 里装
很多老手栽跟头,恰恰是栽在最简单的pip install notebook上。系统 Python 里往往已经有其他项目依赖的包,Jupyter 本身又依赖一堆交互组件,稍有不慎就把包版本改了,轻则某些库升级后不兼容,重则把系统 Python 整个搞坏。更麻烦的是,你根本不知道是哪次安装弄坏的,只能靠回忆排查。
所以我现在无论在哪台机器上装 Jupyter,第一件事永远是先建一个隔离环境。用 conda 就是conda create -n jupyter_env python=3.11,用 venv 就是python -m venv myenv。隔离环境的好处是:将来不要了这个环境,直接删掉文件夹就行,系统环境干干净净。
2. 三种主流安装方式:从零到能用的完整过程
2.1 方式一:Anaconda 图形化安装
Anaconda 的图形安装基本没什么技术含量,官网下载对应系统的安装包,双击运行,一路 Next。唯一要注意的是安装过程中有个 “Add Anaconda to my PATH environment variable” 选项,新版默认是不勾选的。
这个选项很关键。勾选的话,以后你在任意终端都能直接敲jupyter,但可能和你已装的 Python 产生 PATH 优先级冲突;不勾选的话,你得通过开始菜单里的 Anaconda Prompt 才能进入当前环境。我的建议是:如果你不熟悉环境变量,保持默认不勾选,以后统一用 Anaconda Prompt 操作。
装完以后,开始菜单找到 Anaconda Prompt,输入:
jupyter notebook程序会自动启动浏览器进入 Notebook 界面。这是最省心的一条路。
2.2 方式二:Miniconda 命令行安装
Miniconda 安装包很小,装完默认只有 conda 本身和一个基础 Python 环境。重点来了:Miniconda 默认并不带 Jupyter,你需要手动安装。
先创建一个专用环境:
conda create -n jupyter_env python=3.11 -y conda activate jupyter_env然后安装 notebook:
conda install -c conda-forge notebook -y这里我特别说一下为什么推荐conda-forge频道。默认的defaults频道不是不好,但conda-forge社区维护更活跃,Jupyter 生态里的很多新版本和补丁会更快同步过去。如果你在国内网络环境下安装很慢,可以配置国内镜像源加速,设置方法就是改 conda 的配置文件.condarc,把频道地址换成可用的国内镜像,之后conda install的速度会明显提升。
安装完成后启动:
jupyter notebook如果你是新手且不喜欢敲命令行,Miniconda 这条路确实比 Anaconda 麻烦一点,但对电脑空间紧张或者喜欢折腾的人来说,这个代价值得。
2.3 方式三:已有 Python 环境,用 pip 补装
这个场景通常是你已经有了 Python 环境,比如装完 VS Code 自带的 Python,或者公司电脑里已经有一个 Python 版本不想动,只想临时用一下 Notebook。
稳妥的做法是先用 venv 建一个环境,切进去再装:
python -m venv jupyter_venv # Windows jupyter_venv\Scripts\activate # macOS / Linux source jupyter_venv/bin/activate pip install notebook注意我特意避开了“直接在全球环境下 pip install”。你如果想“快速试试”,直接装也不是不行,但后面项目一多就很容易出现依赖冲突。建环境多敲两行命令,换来的是长期清净。
2.4 安装后必须做的验证
不管用哪种方式装完,都建议先验证一下安装是否完整。打开终端输入:
jupyter --version如果能看到类似jupyter core: 5.x.x的输出,说明安装成功。接着输入:
jupyter kernelspec list确认能看到python3内核。这一步很多人会忽略,但恰恰是它决定了你在 Notebook 里能不能正常执行 Python 代码。如果kernelspec list输出是空的,说明 Python 内核没有正确注册,后面写代码就只能看不能跑。
3. 启动失败排查:从“找不到指定的程序”到“突然打不开”
3.1 “找不到指定的程序”:快捷方式的锅和 PATH 的锅
Windows 上双击桌面快捷方式触发“找不到指定的程序”,这是我把这个问题归类的三个字:路径错。最常见的原因是快捷方式指向的pythonw.exe或者jupyter-notebook.exe路径已经不存在了。比如你升级了 Anaconda、把安装目录移动了位置、或者用优化工具清理过系统,都可能让原来的快捷方式变成“死链接”。
排查思路其实很简单:
- 右键快捷方式,属性里看“目标”一栏;
- 把目标里的路径复制到资源管理器地址栏,看那个 exe 文件是否真的存在;
- 如果路径不存在,就手动去 Anaconda 或 Miniconda 的安装目录里找到
python.exe,然后用命令行启动;找不到也没关系,直接在开始菜单搜 Anaconda Prompt 打开,在里面敲jupyter notebook就能绕过快捷方式。
还有一种情况是 PATH 环境变量被改了。某些软件安装时会修改 PATH,把 conda 相关的路径删掉或者挪到后面,导致系统找不到jupyter命令。这种情况你直接在 cmd 里输入:
where jupyter看看能不能输出路径。不能的话,就要去“系统设置 -> 环境变量”里把 Anaconda 的 Scripts 目录加回 PATH。具体路径一般是C:\Users\你的用户名\anaconda3\Scripts。
3.2 “突然打不开了”:端口、缓存、内核三连查
“之前用得好好的,今天突然打不开”,这类问题高频到几乎每周都有人来问我。排查顺序推荐这样走:
第一步,回到启动 Jupyter 的那个命令行窗口,看有没有报错信息。很多误导性的错误在命令行里都有明确输出,比如[Errno 98] Address already in use,就是端口被占用了。
第二步,查 8888 端口占用情况。Windows 上用:
netstat -ano | findstr 8888macOS/Linux 上用:
lsof -i :8888看到 PID 之后,杀掉残留进程再重启 Jupyter。这个是 Jupyter 闪退后最常见的坑:因为页面关掉了,但后台 node 或 python 进程没退出,端口还堵着。
第三步,如果命令行窗口没有任何报错,服务也显示在跑,但浏览器就是打不开,那就试试换一个无痕窗口或者换一个浏览器。好多次所谓“启动失败”,其实是浏览器缓存了一个坏掉的页面,或者某个浏览器插件拦截了本地 localhost 请求。
第四步,依旧不行,就要考虑内核崩了。这种时候在命令行里重新安装一次ipykernel往往能救回来:
pip install --upgrade ipykernel顺带说一个我自己踩过的坑:磁盘空间满了也会导致 Jupyter 打不开。它会在写入缓存或临时文件时失败,症状很像 “Jupyter 没反应”,但其实只是没空间写临时文件了。所以当你排查完上述四个步骤还没解决,顺手看一眼系统盘剩余空间,别问我为什么每次新同事找我排查都要先看这一步。
3.3 网页登录入口和 token 机制
很多刚接触 Jupyter 的人问“网页版登录入口在哪”。其实启动后命令行窗口会输出类似这样一段:
http://localhost:8888/tree?token=9a2f7b5e...这个http://localhost:8888/tree就是登录入口,后面那段token相当于临时密码。第一次访问时会要求输入 token,没有它进不了页面。
如果你把那个窗口关了,忘了 token 怎么办?不用慌,重新打开终端输入:
jupyter server list这个命令会列出当前所有运行中的 Jupyter 服务,每个服务对应的 token 也会一并显示。或者更省事一点,直接设置一个固定的登录密码:
jupyter notebook password设置完成后重启 Jupyter,以后访问只需要输入你设置的密码,再也不用从命令行复制那一长串 token。密码会写入~/.jupyter/jupyter_notebook_config.json,安全性比 token 弱一点,但本机开发完全够用。
4. 让 Notebook 把文件存到你想存的地方:默认目录设置
4.1 先学会临时的--notebook-dir参数
默认情况下 Jupyter 会把文件存放在你启动它的那个目录,也就是终端当前所在的文件夹。很多人每次启动都落在用户主目录,然后在网页里翻了半天找不到自己项目文件夹,干脆就责怪“Jupyter 怎么这么难用”。其实问题只是你没有告诉它工作目录在哪。
不想长期改配置的话,启动时直接指定目录:
jupyter notebook --notebook-dir D:\Projects\PythonmacOS/Linux 同理:
jupyter notebook --notebook-dir /Users/yourname/projectsWindows 下注意路径里的反斜杠,要么用双引号包起来,要么直接把反斜杠改成正斜杠。我用 Windows 机器时一般这样写最稳:
jupyter notebook --notebook-dir "D:/Projects/Python"这种方式的好处是只对当前这次启动生效,适合临时切换目录的场景。
4.2 一劳永逸:修改配置文件
如果你每次打开 Jupyter 都希望它落在同一个目录,那就生成配置文件改一次。
先执行:
jupyter notebook --generate-config这个命令会在~/.jupyter/目录下生成一个jupyter_notebook_config.py文件。用文本编辑器打开,找到这一行:
# c.NotebookApp.notebook_dir = ''把它改成:
c.NotebookApp.notebook_dir = 'D:/Projects/Python/Notebook'注意:我这里特意写了/,Jupyter 在 Windows 下能正确识别正斜杠,还能省掉一堆转义问题。路径里如果含中文,也没问题,只要你的 Python 版本是 3.x,编码默认 UTF-8,不用担心乱码。
保存后重启 Jupyter,你会发现工作目录已经切到新路径了。如果改了配置没生效,别急,先去检查一遍 Jupyter 的配置层级。它的配置读取顺序是:启动目录下的配置文件 > 用户配置 > 系统配置。只要启动目录里没有覆盖用的jupyter_notebook_config.py,正常情况下用户配置是能生效的。
4.3 网页里如何跨目录操作与重命名
有人搜“jupyter 怎么创建在别的文件夹”,其实网页操作逻辑很简单:进入http://localhost:8888/tree文件列表页面后,先在左侧目录树点进想存放文件的目标文件夹,然后再点右上角 New -> Python 3,新建的 Notebook 就会直接落在当前文件夹里。
如果文件已经建错了地方,网页文件列表页支持直接改名和移动。勾选文件后点“重命名”按钮,输入带相对路径的名称就能移动位置。比如你想把根目录下的test.ipynb移到myproject子目录,改名输入myproject/test.ipynb即可。新版 Notebook 也支持鼠标拖拽文件到文件夹里,比旧版舒服不少。
5. 不想开浏览器?把 Jupyter 接进 VSCode
5.1 插件安装与内核选择
很多写 Python 的人离不开 VSCode,Jupyter 和 VSCode 的集成也让不少人直接放弃了浏览器版。操作起来不复杂,核心就两步:
第一步,打开 VSCode 扩展市场,安装两个扩展:Python 和 Jupyter。Python 扩展自带 Notebook 支持,Jupyter 扩展负责连接和运行内核。
第二步,打开一个.ipynb文件,右上角或右下角位置会有“选择内核”的按钮。点它之后,VSCode 会扫描系统里所有可用的 Python 解释器。这里特别提醒:如果你用 conda 建了虚拟环境,一定要在这里选中对应的 conda 环境,否则很可能出现“Jupyter 里 import pandas 失败,但终端明明能 import”这种鬼问题。
5.2 两种工作模式的取舍
VSCode 接 Jupyter 有两种典型用法:
一种是直接编辑.ipynb文件,左上角会出现“单元格”运行按钮,体验和网页版基本一致,但额外有变量查看器、断点调试这些加分项。
另一种是在.py文件里用# %%分隔成代码块,VSCode 会识别出代码块并提供一个“运行单元格”的入口。这种方式特别适合“想把脚本逐渐固化下来”的场景:一开始是探索性代码,后来自然过渡成正式的 Python 模块。
就我个人的使用习惯而言,探索数据、快速验证想法时我还会用网页版;一旦代码量变大、需要调试和 Git 管理,我基本都在 VSCode 里做。因为 VSCode 的调试器可以直接挂在 Jupyter 内核上,在 Notebook 单元格里打断点、看变量、逐行执行,体验比浏览器版强太多。但要注意,VSCode 集成环境偶尔会碰到兼容性问题,比如某些魔术命令(像%matplotlib inline)在 VSCode 里被静默忽略,这时候别死磕,回到浏览器版跑一下很快就能确认是不是环境的问题。
5.3 远程服务器上的 Notebook
再说一个进阶场景:代码跑在远程服务器上,怎么用本地浏览器访问。
基本原理是 SSH 端口转发。本地终端执行:
ssh -L 8888:localhost:8888 your_server登录远程服务器后启动 Jupyter:
jupyter notebook --no-browser --port=8888然后本地浏览器访问http://localhost:8888就能打开远程的 Jupyter 界面。这种方式比你直接配置“远程端口监听”安全得多,因为 8888 端口只暴露在本机,没有暴露到公网。我见过不少人图省事直接把服务绑到0.0.0.0上,这在没有认证保护的情况下等同于把服务器开了一个门,风险很大,不建议这么干。
6. 那些高频“小毛病”:看起来不大,卡起人来要命
6.1 一个单元格只输出最后一行的结果
这是被问得特别多的问题:一个 Cell 里明明写了好几行输出语句,结果只有最后一行显示出来,前面的 print 结果去哪了?
其实这是 Jupyter 的显示机制造成的。一个 Cell 里如果有多条独立的表达式,Jupyter 默认只把最后一个表达式的值自动显示出来。比如:
5 * 2 3 * 4运行后只会显示12,前面那个10不会自动展示。但如果你用了print(),情况又不一样了,print()是显式输出,每一条 print 都会老老实实显示在输出区。
所以如果你想让所有结果都显示出来,要么每条都用print()显式打印,要么用 IPython 提供的display()函数:
from IPython.display import display display(5 * 2) display(3 * 4)这个机制在你要同时展示多个图表的时候特别有用。比如你画了两张图,只写plt.show()它大概率只出最后一张,换成display(fig1)、display(fig2)就能全部显示。这个细节看似不起眼,但使用频率很高。
6.2 复制粘贴多行代码总是报错
代码从网页、PDF、或者别人文档里复制到 Jupyter,经常一粘贴就报IndentationError或SyntaxError。原因在于 Jupyter 对空格和缩进特别敏感,而很多来源的代码里混着看不见的制表符、全角空格,或者粘贴时浏览器自动把缩进吞了。
应对办法很简单:使用 IPython 的%paste魔术命令。先把代码复制到剪贴板,然后在一个 Cell 里输入:
%paste运行它,会弹出一个粘贴区,把内容粘贴进去按回车,IPython 会自动清理格式并执行。这个方法在处理从 PDF 复制带行号的代码时堪称救星。
另一个场景是复制出来的代码开头带着>>>提示符,这多半是从 Python 交互式命令行里复制的。直接粘贴照样报错,同样可以用%paste清理掉>>>和...前缀。如果你用的是 VSCode 里的 Notebook 模式,%paste可能不生效,那就先把代码贴到文本编辑器里统一清理一遍,再粘进单元格,多花十秒钟,能省下十分钟排查时间。
6.3 文件命名:从 untitled2 到有意义的项目名
新开一个 Notebook,默认名永远是Untitled.ipynb,再开一个就是Untitled2.ipynb,如果建多了,列表里全是 Untitled,时间一长根本分辨不出哪个文件是干嘛的。
这个问题的解法没什么技术含量,但真的很影响效率:养成“新建后立刻重命名”的习惯。点击浏览器左上角的Untitled2文件名,直接输入新名字回车即可。文件名尽量包含日期和主题,比如20250115_数据处理.ipynb,这样一周后回来看文件列表也能秒懂。
另外提醒一个容易搞混的点:你在网页里改的名字,其实就是真实文件名。所以千万别在系统文件管理器里随意改正在使用的.ipynb文件名,否则浏览器里的内核定位会乱,严重的会提示“找不到内核”。要改就回到网页里改,一步到位且安全。
6.4 我常用的几个快捷键和补充技巧
顺手分享几个我每天都在用的快捷键,新手记熟这几个就够了:
| 快捷键 | 作用 |
|---|---|
| Shift + Enter | 运行当前单元格并跳转到下一个 |
| Ctrl + Enter | 运行当前单元格但不跳转 |
| Esc + A / Esc + B | 在当前单元格上方/下方插入新单元格 |
| Esc + M / Esc + Y | 把当前单元格切换为 Markdown / 代码模式 |
| Esc + D + D | 删除当前单元格 |
| Tab | 自动补全代码 |
| Shift + Tab | 查看函数签名或文档 |
还有两个魔术命令我觉得比快捷键还实用。一个是%timeit,可以快速测量一行代码的执行时间,做性能验证的时候特别方便;另一个是%whos,可以列出当前环境里的所有变量及其类型、大小,排查“这个变量什么时候被覆盖了”这类问题非常有效。
最后聊一点个人体会。Jupyter Notebook 的安装难点从来不在“安装”本身,而在环境管理和启动配置。你用 conda 建一个专用环境,哪怕只是 Miniconda,后续能少很多麻烦;启动后先跑一遍jupyter kernelspec list验证内核,能避开一大半“装了打不开”的困惑。再有就是上面提到的那些小毛病——输出只显示最后一行、复制粘贴报错、文件命名混乱——趁着项目规模不大时把使用习惯调整好,后面跑数据分析或机器学习项目时会顺畅得多。