如何获取当前IPython/Jupyter Notebook文件路径及切换至其父目录?
嘿,我来帮你搞定这两个Jupyter Notebook里的路径问题!在交互式的Notebook环境里,确实没法像普通Python脚本那样直接用__file__,不过咱们有靠谱的解决办法:
问题1:获取当前IPython Notebook的文件路径(等效__file__功能)
Notebook之所以没有__file__,是因为它运行在内核进程中,并非以脚本文件的方式直接执行。不过有两种常用方法可以拿到准确的文件路径:
方法1:调用Jupyter服务器API(最稳定准确)
这个方法通过查询Jupyter的会话接口,匹配当前内核对应的Notebook文件,只要服务器在运行就不会出错:
from notebook.notebookapp import list_running_servers import os import urllib.parse import requests def get_current_notebook_path(): # 遍历所有正在运行的Jupyter服务器 for server in list_running_servers(): # 获取当前内核的ID(从环境变量中读取) kernel_id = os.environ.get("JPY_KERNEL_ID") if not kernel_id: continue # 拼接查询会话的API地址 api_url = urllib.parse.urljoin(server["url"], f"api/sessions/{kernel_id}") # 带上token验证(如果服务器设置了访问token) headers = {} if server["token"]: headers["Authorization"] = f"token {server['token']}" # 发送请求获取会话数据 response = requests.get(api_url, headers=headers) if response.status_code == 200: session_data = response.json() # 拿到Notebook的相对路径,再拼上服务器的根目录 notebook_rel_path = session_data["notebook"]["path"] full_path = os.path.join(server["notebook_dir"], notebook_rel_path) return os.path.abspath(full_path) return None # 调用函数获取路径 notebook_path = get_current_notebook_path() if notebook_path: print(f"当前Notebook的绝对路径:{notebook_path}") else: print("没找到Notebook路径,请确认Jupyter服务器正在运行哦")
方法2:快速临时方案(适合工作目录没变动的情况)
如果你只是临时使用,而且从打开Notebook后没切换过工作目录,可以直接用%pwd魔术命令查看当前工作目录,再手动加上你的Notebook文件名:
import os current_work_dir = %pwd notebook_path = os.path.join(current_work_dir, "你的Notebook文件名.ipynb")
不过这个方法依赖工作目录没变化,灵活性差一些。
问题2:切换到Notebook文件的父目录
有了上面拿到的Notebook路径,切换父目录就很简单了:
import os notebook_path = get_current_notebook_path() # 用上面的函数获取路径 if notebook_path: # 提取父目录路径 parent_dir = os.path.dirname(notebook_path) # 切换工作目录 os.chdir(parent_dir) print(f"成功切换到父目录:{os.getcwd()}") else: print("没法拿到Notebook路径,没法切换目录哦")
小技巧:如果不想写函数,也可以手动指定(仅限临时场景)
如果你清楚当前Notebook的文件名,而且工作目录和文件目录一致,也可以直接写:
import os notebook_path = os.path.abspath("我的Notebook.ipynb") os.chdir(os.path.dirname(notebook_path))
但还是推荐用第一种方法的函数,避免因为文件名或工作目录变化而出错。
内容的提问来源于stack exchange,提问作者Pablo Marin-Garcia
相关产品推荐
相关产品推荐

