如何在Google Dataproc的Jupyter中将当前目录设为ipynb所在目录
问题根因
Dataproc 2.0-debian10 镜像预装的Jupyter环境做了三层定制,直接覆盖了原生Jupyter随笔记本位置动态切换工作目录的逻辑:
- 全局IPython内核配置硬编码了固定启动目录,强制内核初始工作目录为
/ - 内置的Dataproc Jupyter插件注册了内核启动钩子,每次内核启动都会覆写工作目录参数,用户手动改Notebook配置会被插件覆盖
- 默认将
FileContentsManager.root_dir设为/,让文件浏览根目录和锁死的内核工作目录保持一致,适配GCS桶挂载的存储逻辑
之前修改root_dir只改了文件浏览器的根路径,没有碰内核启动的固定cwd逻辑和插件的覆写钩子,所以工作目录只会固定在Jupyter服务启动路径,不会动态切换。
恢复动态切换特性的操作步骤
所有操作在Dataproc主节点执行即可:
- 编辑全局IPython内核配置文件
/etc/ipython/ipython_kernel_config.py,注释掉硬编码的固定工作目录配置:# 注释掉原有配置 # c.IPKernelApp.cwd = '/' - 编辑Jupyter服务配置文件
/etc/jupyter/jupyter_notebook_config.py,调整两项配置:import os # 清空强制root_dir配置,恢复原生路径解析 c.FileContentsManager.root_dir = '' # 配置内核工作目录自动跟随笔记本路径 c.MappingKernelManager.cwd = lambda nb_path: os.path.dirname(os.path.abspath(nb_path)) - 执行命令禁用Dataproc插件的工作目录覆写钩子:
jupyter serverextension disable --py dataproc_jupyter_plugin.cwd_hook - 重启Jupyter服务让配置生效:
systemctl restart jupyter.service
操作完成后新开任意笔记本,执行!pwd命令验证,工作目录会自动切换到当前.ipynb文件所在路径,写./output.log这类相对路径会直接在同目录生成对应文件,和原生Jupyter行为完全一致。
无权限修改全局配置的兼容方案
如果不能修改服务端配置,可以在所有笔记本的首单元加入如下代码,运行后自动切换工作目录到当前笔记本所在路径:
import os # 自动切换工作目录到当前笔记本所在位置 os.chdir(os.path.abspath(""))
后续所有相对路径读写都会基于笔记本所在目录执行,不需要手动调整绝对路径。
Dataproc默认修改行为的设计逻辑
Dataproc默认锁死工作目录到/,是为了适配镜像自带的Cloud Storage挂载能力:默认配置下Jupyter支持直接读写GCS桶内的笔记本文件,这类非本地文件系统的路径无法和本地工作目录逻辑一一对应,官方为了避免路径解析冲突,直接把本地内核的工作目录固定为根路径,同时强制文件浏览器从根目录起始,保证本地路径和GCS路径的解析逻辑统一。
内容的提问来源于stack exchange,提问作者Leighton Ritchie
相关产品推荐
相关产品推荐

