如何在Jupyter Notebook中获取同文件内其他单元格代码并通过exec()执行?
获取Jupyter Notebook同文件内其他单元格代码的方法
Jupyter的Python内核无法直接访问前端的单元格信息,确实需要结合JavaScript实现,但可以直接在Python单元格里调用JS完成,不用单独编写独立的JS脚本。
方法1:获取上一个单元格代码并执行
直接运行以下代码,就能拿到上一个单元格的代码字符串,后续可通过exec()执行:
from IPython.display import display, JavaScript # 执行JS获取上一个单元格代码,传回Python变量 display(JavaScript(""" var current_idx = Jupyter.notebook.get_selected_index(); var prev_cell = Jupyter.notebook.get_cell(current_idx - 1); var prev_code = prev_cell.get_text(); IPython.notebook.kernel.execute(`prev_cell_code = """ + repr(prev_code) + """`); """)) # 输出并执行代码 print(prev_cell_code) exec(prev_cell_code)
关键逻辑说明
Jupyter.notebook.get_selected_index():获取当前选中单元格的索引值get_cell(index):根据索引获取对应单元格对象,get_text()提取单元格内的文本内容IPython.notebook.kernel.execute():将JS中拿到的代码字符串传递给Python内核,存入变量
方法2:封装成通用函数
如果需要频繁获取任意单元格的代码,可以封装成函数:
from IPython.display import display, JavaScript def get_cell_code(cell_index): display(JavaScript(f""" var cell = Jupyter.notebook.get_cell({cell_index}); var code = cell.get_text(); IPython.notebook.kernel.execute(`target_cell_code = """ + repr(code) + """`); """)) return globals()['target_cell_code'] # 获取当前单元格索引,再获取上一个单元格代码 current_idx = get_ipython().user_ns['_ii'] prev_code = get_cell_code(current_idx - 1) exec(prev_code)
额外注意事项
- 如果目标单元格是Markdown类型,
get_text()会返回Markdown文本,执行前可通过cell.cell_type === 'code'判断类型,避免执行非代码内容 - 修改
cell_index参数,可获取任意位置的单元格代码,比如get_cell_code(0)获取第一个单元格的代码
内容的提问来源于stack exchange,提问作者Lucas Morin
相关产品推荐
相关产品推荐

