
先纠个错标题里的“jupyter book”大概率是 jupyter notebook 的笔误。如果你真的在用 Jupyter Book 写电子书那是另一套配置逻辑但从大多数人搜索的关键词来看大家遇到的就是 Jupyter Notebook 启动后默认落在某个固定目录、以及 Mac 上不知道怎么把文件路径复制出来这两个问题。这篇文章把这两件事一次讲透适用刚换 Mac 的新手也适用被默认路径折磨了一段时间的老用户。先说结论Jupyter 的“默认打开地址”并不是什么神秘配置本质就是一个工作根目录。你启动它时终端在哪个目录它就显示哪个目录。想固定成一个常用目录常见做法有三种写配置文件、启动命令临时指定、用 alias 固化命令。而 Mac 复制文件路径Finder 里有隐藏快捷键也有右键菜单的隐藏选项终端里还有拖拽大法。下面一个一个来。1. 先搞清楚你改的是哪个“默认打开地址”1.1 默认打开地址其实就是工作根目录打开 Jupyter Notebook 后浏览器左侧会显示一个文件列表这个列表对应的是服务器启动时读取的根目录专业术语叫root_dir。你在页面上新建的 notebook、上传的文件、创建的文件夹都会存到这个根目录下面。很多人的困惑来自这里如果你在终端里执行jupyter notebook它的默认根目录就是终端当前所在目录。换句话说你在/Users/me/Documents下启动看到的就是 Documents 的内容你在/Users/me下启动看到的就是用户目录。所以它不是“固定某个地址”而是跟着你启动命令的上下文走。这个概念先理清楚后面所有操作才有意义。因为修改默认打开地址本质上就是告诉 Jupyter不管你在哪个目录敲启动命令我都去读你指定的那个目录。1.2 别把 Jupyter Book 和 Jupyter Notebook 搞混Jupyter Book 是一个基于 Markdown 和 notebook 文件构建在线书籍的开源项目它的目录配置写在_config.yml里和 Jupyter Notebook 完全不是一回事。如果你是在做文档型项目可以另外查相关资料如果只是日常写代码、做分析那按本文操作即可。判断方法很简单终端里执行jupyter --version如果输出里能看到notebook或jupyterlab相关版本号那就是常规环境。后面的内容也都围绕这个来写。2. MacOS 上定位 Jupyter 配置文件2.1 三个容易混淆的配置文件Jupyter 生态里配置文件不止一个很多人改了半天发现不生效就是因为改错了文件。常见的有三类都在用户目录的隐藏文件夹.jupyter下~/.jupyter/jupyter_notebook_config.py老版本 notebook 的主配置几乎所有教程都会提到它。~/.jupyter/jupyter_server_config.py新版 Jupyter 服务端的通用配置Notebook 7 和 JupyterLab 都会读取。~/.jupyter/jupyter_lab_config.pyJupyterLab 环境下的独立配置。如果你用的是 Notebook 7 以后的新版本它对旧参数c.NotebookApp.notebook_dir的兼容性已经弱化某些版本启动时会提示这个参数已弃用deprecated让你改用c.ServerApp.root_dir。这种情况下jupyter_notebook_config.py里改东西就可能不生效。我的建议是新版本统一在jupyter_server_config.py或jupyter_lab_config.py里设置c.ServerApp.root_dir老版本用jupyter_notebook_config.py。判断自己属于哪种看jupyter --version里的 notebook 大版本即可。2.2 用 jupyter --paths 确认实际读取路径在 Mac 上最怕的就是“我以为改的是这个文件程序读的是另一个文件”。Jupyter 提供一个命令可以列出所有配置和数据路径jupyter --paths输出里会分几组路径重点看config部分一般类似config: /Users/yourname/.jupyter /Users/yourname/Library/Jupyter /usr/local/etc/jupyter /etc/jupyter排在最前面的路径优先级最高Jupyter 启动时会按顺序读取后面路径里的配置可能被前面覆盖。如果你发现~/.jupyter下面没有配置文件但~/Library/Jupyter下面有那就要去后者里找。2.3 生成配置文件的正确命令如果对应目录里还没有配置文件用下面命令生成jupyter notebook --generate-config或者更稳妥的方式python -m jupyter notebook --generate-config执行后终端会提示配置文件生成的位置。注意如果文件已存在命令会询问是否覆盖千万别顺手按y否则之前改过的参数全没了。生成后先用jupyter --paths确认一下位置再决定编辑哪个文件。3. 修改默认打开地址的三种可靠方法3.1 改配置文件一劳永逸但注意新老参数名这是最推荐的方案。用文本编辑器打开配置文件搜索root_dir。老版本写法c.NotebookApp.notebook_dir /Users/yourname/Documents/Projects但新版更推荐直接写c.ServerApp.root_dir /Users/yourname/Documents/Projects如果配置文件里同时存在这两个参数c.ServerApp.root_dir优先。我实际操作时发现有些环境两个参数写同一值也不会报错但为了后续少踩坑直接用c.ServerApp.root_dir就好。改完保存重启 Jupyter。怎么确认生效启动日志里有一行非常关键[I ...] Serving notebooks from local directory: /Users/yourname/Documents/Projects这行显示的就是最终生效的根目录。只要它和你配置的一致就说明改成功了。3.2 启动命令临时指定目录调试最快如果你只是想临时用一下某个目录不想改动全局配置启动命令加参数就行jupyter notebook --notebook-dir/Users/yourname/Downloads新版也可以写jupyter notebook --ServerApp.root_dir/Users/yourname/Downloads这个方式非常适合临时调试。比如朋友给你一个项目目录你不想改自己平时的配置直接带上目录启动看完了关掉就行影响范围为零。3.3 给常用命令配置 alias省掉“先 cd 再启动”Mac 默认 Shell 是 zsh配置文件在~/.zshrc。如果你每次启动都想进入同一个目录可以在里面加一行alias jnjupyter notebook --notebook-dir$HOME/Documents/Projects然后执行source ~/.zshrc之后不管终端当前在哪个目录输入jnJupyter 都会以~/Documents/Projects为根目录打开。想切换项目目录时就用jupyter notebook --notebook-dir/具体/路径临时覆盖。这里有个小坑alias 里的路径如果包含空格或中文必须用双引号包住整个参数。我见过有人写成单引号加裸路径启动时报目录不存在排查半天才发现是路径解析问题。4. MacOS 复制文件路径的六种高效姿势4.1 Finder 里最快的一招Command Option C在 Mac 的 Finder 里选中任意文件或文件夹同时按下Command Option C你的剪贴板里就会复制这个对象的绝对路径。直接到终端粘贴就能看到类似/Users/yourname/Documents/Projects/data.csv这个快捷键比右键菜单更通用不需要按住任何修饰键去等菜单刷新选中即复制。刚开始可能不习惯三键组合但练几次后效率提升非常明显。4.2 右键菜单里不常被发现的选项Finder 默认右键菜单只提供“拷贝”不会直接显示“拷贝路径”。但只要你按住 Option 键再右键点击文件菜单里会多出一项将“data.csv”拷贝为路径名称点击后同样复制了绝对路径。这个选项对不喜欢记快捷键的人最友好。唯一要注意的是一定要先按住 Option 不放再去点右键顺序反了菜单不会变化。4.3 终端里拖拽文件的隐藏福利在终端里输入命令行时直接把文件从 Finder 拖进终端窗口系统会自动把文件的绝对路径插入到光标位置。而且它做了一件很贴心的事自动转义空格。比如文件夹名是My Project拖进来后会显示/Users/yourname/My\ Project/这个反斜杠是终端转义符表示空格是路径的一部分。如果你要把这个路径粘贴到 Python 配置文件里反而要把反斜杠去掉不然路径就错了。这个细节很多人栽过跟头。4.4 用 pwd、pbcopy 等命令快速复制路径如果你已经位于某个目录终端里直接输入pwd会显示当前目录的绝对路径。但只是显示还不行要复制的话可以配合 Mac 自带的pbcopypwd | pbcopy执行后当前目录路径就到剪贴板了CtrlV 直接粘贴。反过来如果你想快速进入剪贴板里的路径可以这样cd $(pbpaste)这个组合特别适合从 Finder 复制路径后回终端快速进入目录。体验上可以做到“Finder 复制终端粘贴即走”完全不需要手动输入长路径。4.5 用 mdfind 快速搜索文件完整路径找不到文件在哪但记得名字片段时mdfind是 Mac 自带 Spotlight 的命令行版本mdfind -name test_data结果会输出所有文件名包含 test_data 的完整路径。我经常用它配合pbcopymdfind -name report.pdf | head -1 | pbcopy这样第一个匹配结果的路径就到剪贴板了接着cd $(pbpaste)能直接进入所在目录。适合文件藏在多层文件夹里、Finder 半天翻不到的场景。4.6 从 Finder 复制路径到 Jupyter 配置时的注意事项配置 Jupyter 的root_dir时从 Finder 复制路径是最准确的方式。复制后粘贴到配置文件里长这样c.ServerApp.root_dir /Users/yourname/Documents/Projects这里要注意Python 字符串里不需要对空格做转义直接写在引号内即可。如果你是用终端拖拽得到的路径里面带着反斜杠那就必须先去掉反斜杠再粘贴否则启动 Jupyter 时会提示目录不存在。另外如果路径很长建议用 Python 的原始字符串写法c.ServerApp.root_dir r/Users/yourname/Documents/My Project这样中文、空格、特殊符号都更安全不容易因为转义问题引发莫名其妙的报错。5. 常见报错与排查实录5.1 改了配置却不生效问题出在哪这是最常被问的问题。几个最主要的原因第一改错了文件。打开jupyter --paths看实际读取顺序不要想当然改~/.jupyter/jupyter_notebook_config.py新版环境可能不读它。第二新老参数名混用。老版本的c.NotebookApp.notebook_dir在新版里可能被忽略或提示弃用统一用c.ServerApp.root_dir更稳。第三启动命令覆盖了配置文件。如果你终端里执行的命令带了--notebook-dir那它优先级高于配置文件配置自然不生效。排查时看启动日志里Serving notebooks from local directory:后面的路径那就是最终结果。第四改了配置没重启。配置文件只在 Jupyter 启动时读取一次运行中修改不会热更新。改完必须重启。5.2 路径带空格、中文目录怎么处理使用配置文件时把路径完整写在引号里空格和中文都没有问题。但使用命令行参数时必须加引号jupyter notebook --notebook-dir/Users/yourname/My Project或者jupyter notebook --notebook-dir/Users/yourname/数据分析如果不加引号命令行工具会认为空格后面是另一个参数然后报错或直接忽略。这个坑在 Mac 的 zsh 里尤其明显因为中文目录名在 Finder 里看起来很自然一到终端就忘了加引号。5.3 端口被占用、页面一直加载不出来启动 Jupyter 后浏览器一直转圈或者显示“正在连接服务器”一般不是目录问题而是服务没起来。先在终端看有没有类似日志[E ...] Error: Port 8888 is already in use如果端口被占用lsof查占用进程lsof -i :8888然后杀掉对应进程或者直接换端口启动jupyter notebook --port8899还有一种情况是浏览器开了旧的标签页一直在连旧端口。清掉旧标签页重新打开http://localhost:8899就好。别跟我一样被这个假问题折磨了十分钟。另外如果登录页面要求输入 token而你不知道在哪里找执行jupyter notebook list输出里会显示当前服务的完整 URL 和 token复制到浏览器即可。5.4 局域网共享时的安全注意如果你想让局域网里的其他设备访问你本机的 Jupyter通常会设置c.ServerApp.ip 0.0.0.0 c.ServerApp.port 8888然后启动。这里必须强调这样等于把你的 notebook 服务暴露到局域网其他人只要知道地址和端口就能打开登录页。千万不要用默认的 token 或者空密码至少设置一个密码jupyter notebook password执行后会提示输入密码它会保存到 Jupyter 的配置里后续访问时用这个密码登录。个人经验是除非确实有需求否则不要把ip改成0.0.0.0只在开发环境里用127.0.0.1就够了。最后说点我自己的习惯。工作这几年Jupyter 的默认目录被我改过很多次也踩过改错文件、路径带空格、参数弃用这些坑。现在我的做法是所有项目统一放~/workspace下配置文件里写死c.ServerApp.root_dir /Users/yourname/workspace再在 zshrc 里配一个 alias 快速启动。Finder 复制路径用Command Option C已经形成肌肉记忆配合cd $(pbpaste)来回切换目录几乎不用再手动输路径。这套组合拳打下来日常工作顺畅很多也希望能帮你省下点折腾时间。