Jupyter中Run All Cells时无法将当前笔记本名称存入Python变量的问题
解决Jupyter Notebook中Run All时无法获取笔记本名称的问题
你遇到的问题确实是Python与JavaScript执行的异步性导致的:当你使用"Run All Cells"或者合并单元格时,Python代码会按顺序同步执行,但Javascript的IPython.notebook.kernel.execute是异步发送命令给内核的——Python代码不会等JS完成赋值操作,就直接执行了后面的notebook_name引用,自然会报NameError。
下面提供几种可靠的解决方案:
方案1:让Python等待JS完成赋值(简单适配)
通过循环等待变量被创建,确保JS的赋值操作完成后再执行后续代码:
from IPython.display import Javascript, display # 执行JS代码,同时标记任务完成状态 display(Javascript(''' const nbName = IPython.notebook.notebook_name; IPython.notebook.kernel.execute(`notebook_name = "${nbName}"`); // 发送加载完成的信号 IPython.notebook.kernel.execute('nb_name_loaded = True'); ''')) # 循环等待变量加载完成 while not locals().get('nb_name_loaded', False): pass # 现在可以正常访问变量了 print(notebook_name)
方案2:使用异步等待(适合Jupyter Lab/Notebook 7+)
利用Python的asyncio等待JS操作完成,更优雅:
from IPython.display import Javascript, display import asyncio async def fetch_notebook_name(): # 执行JS赋值 display(Javascript(''' IPython.notebook.kernel.execute(`notebook_name = "${IPython.notebook.notebook_name}"`); ''')) # 等待变量出现在本地命名空间 while 'notebook_name' not in locals(): await asyncio.sleep(0.05) # 等待异步任务完成 await fetch_notebook_name() print(notebook_name)
方案3:直接从Jupyter内核获取(最可靠,无JS依赖)
绕开JS,直接通过Jupyter的内核元数据获取笔记本名称,彻底避免异步问题:
import os import json from jupyter_core.paths import jupyter_data_dir from notebook.notebookapp import list_running_servers def get_current_notebook_name(): kernel_id = os.environ.get('JPY_KERNEL_ID') if not kernel_id: return None # 遍历Jupyter数据目录,找到当前内核的信息文件 for root, _, files in os.walk(jupyter_data_dir()): for file in files: if file.startswith(f'kernel-{kernel_id}') and file.endswith('.json'): with open(os.path.join(root, file), 'r') as f: kernel_info = json.load(f) notebook_path = kernel_info.get('notebook_path') if notebook_path: return os.path.basename(notebook_path) return None # 获取并打印笔记本名称 notebook_name = get_current_notebook_name() print(notebook_name)
各方案对比
- 方案1/2:依赖Jupyter前端的JS API,适合快速测试,但在某些特殊环境(如headless运行的Jupyter)可能失效。
- 方案3:直接读取内核的元数据,不依赖前端,兼容性和可靠性最好,推荐在生产环境或复杂场景使用。
内容的提问来源于stack exchange,提问作者Apogentus
相关产品推荐
相关产品推荐

