繁体   English   中英

运行 IPython 笔记本时如何(间歇性地)跳过某些单元格?

[英]How to (intermittently) skip certain cells when running IPython notebook?

我通常必须在重新打开笔记本时重新运行(大部分)笔记本,以便访问以前定义的变量和 go 工作。

但是,有时我想跳过一些对后续单元格没有影响的单元格(例如,它们可能包含已完成的分析分支)并且可能需要很长时间才能运行。 这些单元格可以分散在整个笔记本中,因此“Run All below”之类的内容不会有太大帮助。

有没有办法做到这一点?

理想情况下,这些单元格可以用一些特殊标志标记,以便它们可以手动“运行”,但在“全部运行”时会被跳过。

编辑

@Jakob 建议的%%cache (ipycache 扩展)在一定程度上解决了这个问题。

实际上,我什至不需要在重新运行时加载任何变量(可能很大但对于后续单元格来说是不必要的),只有存储的 output 对分析结果很重要。

作为一种解决方法,将%%cache folder/unique_identifier放在单元格的开头。 代码将只执行一次,重新运行时不会加载任何变量,除非您删除 unique_identifier 文件。

不幸的是,使用%%cache重新运行时,所有 output 结果都将丢失...

编辑二(2013 年 10 月 14 日)

ipython+ipycache 的主版本现在也腌制(并重新显示)codecell output。

对于丰富的显示输出,包括 Latex、HTML(pandas DataFrame 输出),记得使用 IPython 的 display() 方法,例如display(Latex(r'$\alpha_1$'))

虽然这不是您似乎正在寻找的内容,但如果您希望完全省略单元格的执行(没有加载缓存的结果),您可以在单元格的开头添加以下 hack(假设您是使用基于 Unix 的操作系统):

%%script false 

或变体(从 2020 年初开始工作 - 请参阅此处了解解释):

%%script false --no-raise-error

目前,IPython 笔记本中不包含此类功能。 尽管如此,还是有一些可能性可以让您的生活更轻松,例如:

  • 使用%store或者更好的%%cache魔法(扩展)来存储这些间歇性单元格的结果,因此不必重新计算它们(参见https://github.com/rossant/ipycache

  • 在您不想执行的单元格之前添加if==0:

  • 将这些单元格转换为原始单元格(但您将丢失已经存储的输出!)

(参见https://github.com/ipython/ipython/issues/2125 上的讨论)

雅各布

如果不希望加载缓存结果,我发现Freeze nbextension 对此非常有用。

在此处输入图片说明

尽管是非官方的,但我强烈建议您尝试使用这些笔记本扩展,如果您以前从未使用过它们。

要安装扩展机械,

$ pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install

要启用Freeze扩展,请启动jupyter notebook并打开一个新 notebook,从菜单中选择Edit > nbextensions config ,然后选中Freeze

这是一个简单而通用的解决方案,无需解决方法:只需将其作为单元格的第一行键入即可跳过单元格:

%%script 回声跳过

它在 Windows 和 Mac 上使用最近的 Jupyter 进行了测试,我认为它也应该适用于其他类 Unix 平台,因为它们也有一个 echo 命令。 其他一些提议的解决方案更加特定于平台。

当然,您可以输入您喜欢的任何文字,而不是“跳过”。 当您执行单元格时,它只会打印此文本而不是执行单元格中的代码。

这个问题有点老了,但似乎缺少最方便的答案。 您可以使用 NBextensions 中的“初始化单元”。 安装/激活后,您可以在任何笔记本中将单元格标记为“初始化单元格”,然后可以使用特定按钮运行。

  • 安装 NBextensions: 这里
  • 启动 jupyter 仪表板时激活“初始化单元”

  • 在您的笔记本中,在“查看”菜单中选择“单元格工具栏”,然后选择“初始化单元格”

  • 现在每个单元格旁边都有一个复选框。 标记您要运行以进行初始化的所有单元格
  • 重新打开笔记本时,单击看起来像袖珍计算器的按钮以运行所有初始化单元。

跳过运行 jupyter notebook 单元格中的 python 代码的最简单方法,我暂时将这些单元格转换为 Markdown。

%%script false解决方案在 2019 年的某个时间停止工作。

以下是一些其他可用的解决方法。 这些是基于程序在您告诉他们不要期望任何论点时忽略他们的论点。 下面是一些简单的例子:

珀尔:

%%perl -e0
​
for i in range(10): print(i)

在这里你正在运行: perl -e '0' cellcontents

一个更令人难忘的版本:

%%perl -eat
​
for i in range(10): print(i)

在这里你正在运行: perl -e 'at' cellcontents

重击:

%%bash -c :

for i in range(10): print(i)

':' 是 bash 中的一个 noop,所以你正在运行: bash -c : cellcontents

我没有看过外部魔术实现代码,但我很确定“cellcontents”作为参数传递并且不会被shell错误地解释,比如你是否要包含';' 在它们中,不小心注入了一些不好的代码。 但我不能向你保证。

我相信你可以想出其他创造性的解决方案,通过查看这里支持的程序: https : //ipython.readthedocs.io/en/stable/interactive/magics.html#cell-magics

对于您希望在按Run All时跳过的单元格,您可以使用try / except块,您可以尝试在try块中显示已计算的信息,并在except块中执行计算。

以这个单元格为例:

my_results = 2 # Assume this is a bigger calculation
print(my_results)
print('displayed my results.')

要在后续运行中跳过此单元格的计算,请将此单元格的内容更改为以下内容:

try:
  print(my_results)
  print('displayed state value')
except:
  my_results = 2 # Assume this is a bigger calculation
  print(my_results)
  print('displayed newly calculated value')

第一次运行此单元格时,它将尝试打印 state 变量my_results的值。 这会引发异常,因此它会跳转到except块并进行my_results的实际计算(在这种情况下,它等于2 )。 在第一次运行结束时,此单元的 output 将是:

2
displayed newly calculated value

当您第二次运行单元格时(无论是手动运行还是通过Run All ), try块将首先执行,但这次由于变量在 state 中可用,因此不会引发异常。 相反,它会显示结果,并且永远不会运行except块。 在第二次运行结束时,该单元的 output 将是:

2
displayed state value

这不符合您应该完全跳过单元格的明确标准,但实际上跳过了计算。

如果信息的显示比使用单个printdisplay更复杂,如果将显示例程变成 function 可能会更干净,如下所示:

def print_my_results(my_result):
  print(my_result)
  print('displayed my result.')

try:
  print_my_results(my_results)
except:
  my_results = 2 # Assume this is a bigger calculation
  print_my_results(my_results)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM