You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:30:28