Ipython Notebook:编程读取和执行单元格

12
在ipython notebook中,我希望可以在一个代码单元格内编写代码,从而以编程方式读取和执行其他代码单元格的内容。
类似以下示例:
if condition:
  # run input cell no. 3

我在这里找到了一个解决方案(点击此处),函数execute_notebook逐个读取ipynb文件的单元格,并使用get_ipython().run_cell() 执行代码单元格。

是否有一种方法可以实现同样的功能,即无需先从外部ipynb文件读取单元格?是否有一种编写宏的方式,可以引用并访问IPython笔记本内的代码单元格?

3个回答

3
我不确定我是否正确理解了你的问题。您想要操作与当前正在使用的笔记本完全相同的笔记本吗?虽然这可能是可能的,但它实际上听起来像是一场灾难的配方,因为它很可能会使您当前正在运行的笔记本处于未定义状态(或者至少会使其难以跟踪发生了什么)。
一个更干净的解决方案可能是通过编程生成一个单独的笔记本,在其中包含您需要的代码单元格,然后执行它。(或者,您可以拥有一个“模板” .ipynb 文件,其中包含虚拟代码单元格,然后通过编程将其替换为要运行的实际代码)。
最近我也需要做类似的事情,并写了一个detailed example,展示了如何做到这一点。它通过编程生成一个新的笔记本,添加了一些标记和代码单元格(在这种情况下,它产生一个正弦波图,其中频率是即时注入的),然后执行此笔记本并保存结果以进行进一步的后处理。
希望这有所帮助。如果我完全误解了您要做的事情,请告诉我。

2

嗨,你问题的确切答案是:

import io
from IPython.nbformat import current

with io.open("Name_of_your_notebook.ipynb") as f:
nb = current.read(f, 'json')

ip = get_ipython()

for cell in nb.worksheets[0].cells:
  if cell.cell_type != 'code':
    continue
  if cell.prompt_number==4186:
    ip.run_cell(cell.input)

请注意,单元格将在此代码下运行,而不像在Python中作为函数一样。

0

我认为在这种情况下最好的方法是编写一个过程并随意运行它。但作为一种脑力锻炼,我建议两个选项。

  1. 当达成某些条件时(假设我们想要像您的示例中那样重用第三个),您可以使用 exec 来执行单元格中的代码
if condition:
    exec(In[3])
  • 更可靠的解决方案可能是使用标记单元格和一个神奇命令rerun
  • if condition:
        %rerun -g 'unique mark'
    

    但是,我相信最好的方法是编写一个过程并重复使用它。

    example how to reuse cell


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接