Macros Ipython笔记本:以编程方式读取和执行单元格

Macros Ipython笔记本:以编程方式读取和执行单元格,macros,jupyter-notebook,Macros,Jupyter Notebook,在ipython笔记本中,我希望以编程方式从代码单元本身中读取和执行代码单元 差不多 if condition: # run input cell no. 3 我找到了一个解决方案,函数execute\u notebook逐单元格读取ipynb文件,并使用get\u ipython().run\u cell()执行代码单元格 有没有办法做到这一点,即不首先从外部ipynb文件读取单元格?有没有办法编写宏,从ipython笔记本中引用和访问代码单元格?我不确定是否正确理解了您的问题。您是否希

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

差不多

if condition:
  # run input cell no. 3
我找到了一个解决方案,函数
execute\u notebook
逐单元格读取
ipynb
文件,并使用
get\u ipython().run\u cell()
执行代码单元格


有没有办法做到这一点,即不首先从外部
ipynb
文件读取单元格?有没有办法编写宏,从ipython笔记本中引用和访问代码单元格?

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

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

我最近需要做一件类似的事情,并且写了一篇文章来展示如何做到这一点。它以编程方式生成一个新笔记本,添加一些标记和代码单元(在本例中,这些单元会生成一个正弦波图,其中频率会动态注入),然后执行此笔记本并保存结果以供进一步的后处理


我希望这有帮助。如果我完全误解了您的意图,请告诉我。

您好,您问题的确切答案是:

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中的函数那样

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

  • 要在满足某些条件时从单元格中执行代码(假设我们要像您的示例中那样重用第三个),可以使用
    exec
  • 如果条件:
    执行官(在[3]中)
    
  • 更可靠的解决方案可能是使用带标记的单元格和魔术命令
    重新运行
  • 如果条件:
    %重新运行-g“唯一标记”
    
    但是,我很确定最好的方法是编写一个过程并重用它