如何调用其他Notebook并获取其回传的变量
跨Notebook回传读取数据变量的实现方案
这个需求完全可以实现,根据你的使用场景选下面任意一种方法就行,不需要重构现有读数据的逻辑:
- 最简方案:用Jupyter内置
%run魔法命令
直接在发起调用的Notebook单元格中执行%run ./存储读数据逻辑的Notebook路径.ipynb,命令执行完成后,被调用Notebook内的所有全局变量(包括你存了已读取数据的目标变量)会自动注入当前Notebook的内核作用域,直接用原变量名就能访问到读取结果。
如果被调用的Notebook里写了调试、测试类不需要在被调用时执行的代码,可以把这部分代码包裹在if __name__ == "__main__":判断块里,%run触发执行时这部分逻辑不会运行,避免多余操作干扰。 - 避免变量污染方案:用
%store魔法定向传值
如果你担心被调用Notebook里的临时变量和当前Notebook的变量重名冲突,可以用定向传值的方式:- 在被调用的读数据Notebook里,完成数据读取赋值后,新增一行
%store 你的数据变量名,将目标变量存入Jupyter的跨Notebook变量缓存区 - 在发起调用的Notebook里,完成对目标Notebook的调用后,执行
%store -r 你的数据变量名,即可单独将目标数据变量加载到当前环境,不会带入其他无关变量
不需要保留缓存时,执行%store -z就能清空所有已存储的跨Notebook变量。
- 在被调用的读数据Notebook里,完成数据读取赋值后,新增一行
- 工程化调度方案:用papermill做参数化回传
如果你是在做Notebook流水线的自动化调度,可以用papermill工具执行被调用的读数据Notebook,执行时指定输出Notebook路径,运行结束后可直接通过工具提供的接口读取被执行Notebook内的任意变量值,适合批量、自动化的生产场景。
注意:以上直接透传变量的方案,都要求两个Notebook挂载在同一个Jupyter服务实例下、共享同一套内核服务;如果两个Notebook跑在完全隔离的独立环境中,无法直接透传变量,可临时将读取到的数据存为pkl、parquet等格式的中间文件,再在调用端读取文件拿到数据,常规本地启动的Jupyter环境默认都满足同实例要求,不需要额外配置。
内容的提问来源于stack exchange,提问作者user626528
相关产品推荐
相关产品推荐

