Jupyter Lab中如何查看函数或变量来自哪个导入文件
%run导入对象所属源文件的可行方法 在Jupyter环境中工作时,常通过%run命令从多个笔记本文件导入内容,典型执行命令如下:
%run file_1.ipynb %run file_2.ipynb
这种场景下直接调用my_amazing_function()时,无法快速确认函数定义在file_1.ipynb还是file_2.ipynb中,以下是经过验证的可行方案:
方法1:用内置
inspect模块快速查询函数/类来源
不需要安装第三方依赖,直接在代码单元格执行以下命令即可,适合快速定位函数、类的定义位置:import inspect # 将括号内替换为你要查询的实际函数/类名 print(inspect.getfile(my_amazing_function))命令执行后会直接输出对象定义所在的完整文件路径,直接对应到具体的ipynb文件即可。注意该方法仅对函数、类等可挂载属性的对象有效,普通数值、字符串类全局变量建议使用第二种方法。
方法2:改造
%run逻辑,批量标记所有导入对象的来源
如果需要频繁查询不同变量、函数的来源,可以在执行所有%run命令前,先运行以下代码给%run命令增加来源标记逻辑,后续所有导入的对象都会自动绑定所属源文件信息:from IPython import get_ipython from functools import wraps # 保留原始%run命令的执行逻辑 original_run_magic = get_ipython().run_line_magic @wraps(original_run_magic) def tracked_run(line, cell=None): line = line.strip() if line.endswith('.ipynb'): source_nb = line # 记录执行前已存在的全局变量 existed_vars = set(globals().keys()) # 执行原始%run命令 ret = original_run_magic('run', line) # 给新增的变量绑定来源标记 for var_name in globals().keys() - existed_vars: if var_name.startswith('_'): continue var_obj = globals()[var_name] try: var_obj.__source_notebook__ = source_nb except (AttributeError, TypeError): # 数字、字符串等不可变类型无法挂载属性,用全局映射表存储 if '_nb_source_map' not in globals(): globals()['_nb_source_map'] = {} globals()['_nb_source_map'][var_name] = source_nb return ret # 非ipynb文件走原始执行逻辑 return original_run_magic('run', line) get_ipython().run_line_magic = tracked_run标记完成后查询来源非常简单:
# 查询函数/类来源 print(my_amazing_function.__source_notebook__) # 查询普通变量来源,比如导入的名为train_data的变量 print(_nb_source_map['train_data'])方法3:临时排查用控制变量法验证
如果只是单次临时排查,不需要写额外逻辑,可以先注释掉其中一条%run命令,重启内核后重新运行所有单元格,如果调用目标函数时抛出NameError,就说明函数定义在你注释掉的那个笔记本文件里,反之则在未注释的文件中。
注意:Jupyter的
%run执行ipynb文件的本质是把目标笔记本的所有代码直接在当前全局命名空间执行,和普通.py文件的import逻辑不同,不要尝试通过对象的__module__属性查询来源,返回结果对ipynb导入的对象不具备参考性。
内容的提问来源于stack exchange,提问作者ebubekir

