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

时间:2014-03-11 14:03:32

标签: macros jupyter-notebook

在ipython笔记本中,我想以编程方式从代码单元本身中读取和执行代码单元。

这样的东西
if condition:
  # run input cell no. 3

我找到了解决方案here,函数execute_notebook逐个单元地读取ipynb文件,并使用get_ipython().run_cell()执行代码单元。

有没有办法做同样的事情,即没有先读取外部ipynb文件中的单元格?有没有办法编写宏,从ipython笔记本中引用和访问代码单元?

3 个答案:

答案 0 :(得分:1)

我不确定我是否理解你的问题。您是否希望能够操作您目前正在使用的完全相同的笔记本?虽然这个可能可能,但老实说听起来像是灾难的一个因素,因为它很可能会使你当前正在运行的笔记本处于一个未定义的状态(或者至少它会让你很难跟踪它的发展上)。

更干净的解决方案可能是以编程方式生成一个单独的笔记本,其中您精确包含了用例所需的代码单元,然后执行它。 (或者,您可以使用带有虚拟代码单元的“模板”.ipynb文件,然后以编程方式将其替换为您要运行的实际代码。

我最近需要做类似的事情,并写了detailed example来说明如何做到这一点。它以编程方式生成一个新的笔记本,添加一些降价和代码单元(在这种情况下产生正弦波图,其中频率是即时注入的),然后执行此笔记本并保存结果以进行进一步的后处理。

我希望这会有所帮助。如果我完全误解了你要做的事情,请告诉我。

答案 1 :(得分:0)

您的问题的确切答案是:

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)

但是请保持在中间,单元格将在此代码下运行,而不像py中的函数那样

答案 2 :(得分:0)

我认为在这种情况下最好的方法是编写一个过程并根据需要运行它。但作为一种大脑锻炼,我建议两种选择。

  1. 要在满足某些条件时执行单元格中的代码(假设我们要重用示例中的第三个),您可以使用 exec
if condition:
    exec(In[3])
  1. 更可靠的解决方案可能是使用标记的单元格和魔术命令 rerun
if condition:
    %rerun -g 'unique mark'

但是,我很确定最好的方法是编写一个过程并重用它。

example how to reuse cell