如何获取IPython Notebook的当前文件名?
获取Jupyter Notebook文件名的可行方案
你提到的__file__属性在Notebook环境中不存在,因为Notebook是通过内核运行的,没有对应的脚本文件路径。以下是几种无需依赖ipyparams或ipynbname的解决方法:
方法1:通过JavaScript传递文件名(经典Jupyter Notebook适用)
利用Notebook前端的JavaScript API获取文件名,再传递给Python变量:
import os from IPython.core.display import Javascript def get_notebook_name(): js_script = """ var kernel = IPython.notebook.kernel; var command = "notebook_name = '" + IPython.notebook.notebook_name + "'"; kernel.execute(command); """ display(Javascript(js_script)) # 获取文件名 get_notebook_name() # 提取前缀 prefix = os.path.splitext(os.path.basename(notebook_name))[0]
方法2:适配Jupyter Lab的版本
如果使用Jupyter Lab,调整JavaScript代码即可:
import os from IPython.core.display import Javascript def get_notebook_name_lab(): js_script = """ var notebook_title = document.querySelector('.jp-NotebookPanel-title').textContent; var kernel = Jupyter.notebook.kernel; var command = "notebook_name = '" + notebook_title + "'"; kernel.execute(command); """ display(Javascript(js_script)) get_notebook_name_lab() prefix = os.path.splitext(os.path.basename(notebook_name))[0]
方法3:兼容脚本与Notebook的通用写法
如果需要同时支持Python脚本和Notebook环境,可以加入异常捕获和手动 fallback:
import os from IPython.core.display import Javascript def get_notebook_name(): try: js_script = """ var kernel = IPython.notebook.kernel; var command = "notebook_name = '" + IPython.notebook.notebook_name + "'"; kernel.execute(command); """ display(Javascript(js_script)) return True except: return False # 尝试获取前缀 try: # 脚本环境优先 prefix = os.path.splitext(os.path.basename(__file__))[0] except AttributeError: # Notebook环境尝试自动获取 if get_notebook_name(): prefix = os.path.splitext(os.path.basename(notebook_name))[0] else: # 自动失败时手动指定 prefix = "default_prefix"
内容的提问来源于stack exchange,提问作者Uri Cohen
相关产品推荐
相关产品推荐

