很多人想在 Jupyter 里一次性配置“多个工作目录”,结果越改越乱,最后问题往往不在配置文件,而在路径概念本身。本文先说明 Jupyter 为什么不能直接设置多个默认目录,再分别给出多实例启动、单会话切换目录和 VS Code 远程自动对齐路径的做法,帮助你判断哪种方案最适合自己的使用场景。
Jupyter 为何不能直接配置多个默认工作目录
先说结论:Jupyter 本身并不支持“多个默认工作目录”。在 jupyter_notebook_config.py 中,c.NotebookApp.notebook_dir 只能设置一个路径,Notebook 服务启动后也只有一个根目录。
因此,大家常说的“多个工作目录”,本质上通常是两类方案:
- 在同一台机器上启动多个独立的 Notebook 服务,每个服务对应一个目录和端口。
- 只启动一个服务,但在 Notebook 运行过程中动态切换当前工作目录。
如果这里不先分清,后面就很容易把“服务根目录”“Kernel 当前目录”“Notebook 文件实际所在位置”混为一谈,进而导致 import、open() 或相对路径读取数据时频繁报错。
用 --notebook-dir 启动多个独立服务
如果你需要同时维护多个项目,而且希望彼此文件树、入口路径和运行环境尽量互不干扰,多开 Notebook 服务是最直接的办法。

做法很简单:打开两个命令行窗口,分别指定不同目录和不同端口启动。
jupyter notebook --notebook-dir="D:project_a" --port=8888
jupyter notebook --notebook-dir="E:project_b" --port=8889
启动后,浏览器分别访问 http://localhost:8888 和 http://localhost:8889,看到的就是两个相互隔离的 Notebook 环境。每个服务都有自己的根目录视图,不会混到一起。
这里最需要注意的是端口冲突。如果两个实例都占用同一个端口,第二个服务会直接报错:
Port 8888 is already in use
在 Windows 下,如果你经常这样使用,也可以把启动命令分别保存为 start_a.bat 和 start_b.bat,后续双击即可启动,省去重复输入命令的步骤。
这个方案适合并行开发多个项目,尤其是项目目录相隔较远、相对路径很多,或者你希望每个服务都明确绑定一个固定项目根目录时。
在单个 Notebook 会话里动态切换当前工作目录
如果你已经打开了某个 Notebook,只是临时要访问别的项目子目录、加载数据文件,或者测试另一套模块路径,那么没有必要专门再开一个服务。此时更合适的做法,是直接切换当前 Kernel 的工作目录。
最简单的方式是使用魔法命令:
%cd ../other_project
%cd D:dataraw
也可以用 Python 标准库:
import os; os.chdir(r'D:modelsexp_v2')
切换后,可以立刻验证当前目录是否已经生效:
!pwd
在 Linux/macOS 下常用 !pwd,Windows 下则可以用:
!cd
不过,这种方式有一个经常被忽略的限制:Kernel 一旦重启,当前目录会恢复为服务启动时的 notebook_dir,而不是你上一次通过 %cd 切换后的路径。
这也是为什么有些人明明刚刚还能读到文件,重启内核后又突然报路径错误。问题不一定出在代码本身,而是当前工作目录已经回退了。
另外,如果你的 Notebook 中大量使用相对路径导入模块,通常更稳妥的做法是始终先 %cd 到该 Notebook 所在目录,再去执行导入或读取操作。这样能有效避免因为运行目录错位而触发 ModuleNotFoundError。
VS Code 远程连接时,让内核自动切到当前 .ipynb 目录
很多路径问题在 VS Code 远程开发场景里更明显:你本地打开的是 project2/main.ipynb,但远程内核实际运行目录却在 /home/user/src。Notebook 文件位置和内核当前目录一旦错位,代码里依赖相对路径的部分就容易出问题。
这种情况下,可以在 VS Code 的 settings.json 中加入启动命令,让每次连接内核时都自动切换到当前 .ipynb 所在目录:
"jupyter.runStartupCommands": ["import os; os.chdir(os.path.dirname(__vsc_ipynb_file__))"]
这里的 __vsc_ipynb_file__ 是 VS Code 注入的变量,值就是当前打开的 .ipynb 绝对路径。这样做之后,每次内核连接时都会自动执行一次目录切换,使 os.getcwd() 与 Notebook 文件所在目录保持一致。
这个方案的优点也很明确:它不依赖服务端去改 Jupyter 配置,对远程服务器基本是零侵入,更适合多人共用环境或不方便调整服务启动参数的场景。
真正要盯住的是三层路径关系
很多人以为自己遇到的是“Jupyter 怎么配置多个工作目录”的问题,实际上更关键的是没有把下面三层路径区分开:

- 服务启动目录
- Kernel 当前目录
- Notebook 文件物理位置
这三者一旦不一致,import 和 open() 就容易出现行为偏差:模块导入失败、数据文件找不到、相对路径指向错误目录,都是常见结果。
所以,与其反复改配置,不如先确认当前实际运行位置。最直接的判断方式,往往就是查看 os.getcwd() 的输出。只要先把路径关系理顺,再决定应该多开服务、临时 %cd,还是交给 VS Code 自动处理,问题就会清楚很多。









