10

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

就像是

if condition:
  # run input cell no. 3

我在这里找到了一个解决方案,该函数逐个单元格execute_notebook读取ipynb文件单元格并使用get_ipython().run_cell().

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

4

3 回答 3

3

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

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

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

我希望这有帮助。如果我完全误解了您要做什么,请告诉我。

于 2015-05-04T18:57:32.070 回答
1

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

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

于 2019-11-28T13:57:16.470 回答
0

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

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

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

示例如何重用单元格

于 2021-01-12T19:07:45.573 回答