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

brvekthn  于 2023-05-16  发布在  Python
关注(0)|答案(9)|浏览(116)

当重新打开笔记本时,我通常不得不重新运行(大部分)笔记本,以便访问以前定义的变量并继续工作。
但是,有时我想跳过一些单元格,这些单元格对后续单元格没有影响(例如,它们可能包含已完成的分析分支),并且可能需要很长时间才能运行。这些单元格可以分散在整个笔记本中,所以类似“运行下面的所有内容”之类的东西不会有太大帮助。
有没有办法做到这一点?
理想情况下,这些单元格可以用一些特殊的标志来标记,以便它们可以手动“运行”,但在“全部运行”时将被跳过。

编辑

@Jakob建议的%%cache(ipycache扩展)在一定程度上解决了这个问题。
实际上,在重新运行时,我甚至不需要加载任何变量(这些变量可能很大,但对于后续单元格来说是不必要的),只有存储的输出才是分析结果。
作为变通方法,将%%cache folder/unique_identifier放在单元格的开头。代码将只执行一次,重新运行时不会加载任何变量,除非删除unique_identifier文件。

不幸的是,使用%%cache重新运行时,所有输出结果都丢失了...
编辑II(2013年10月14日)

主版本的ipython+ipycache现在也会pickle(并重新显示)codecell输出。
对于包括Latex、HTML(pandas DataFrame输出)在内的丰富显示输出,请记住使用IPython的display()方法,例如display(Latex(r'$\alpha_1$'))

fdbelqdn

fdbelqdn1#

虽然这并不是你想要的,但如果你想完全省略单元格的执行(其中没有加载缓存结果),你可以在单元格的开头添加以下技巧(假设你使用的是基于Unix的操作系统):

%%script false

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

%%script false --no-raise-error
lymnna71

lymnna712#

目前,IPython notebook中还没有包含这样的功能。然而,有一些可能性可以让你的生活更轻松,比如:

  • 使用%store或者更好的%%cache magic(扩展)来存储这些间歇性单元格的结果,因此它们不必重新计算(请参见https://github.com/rossant/ipycache
  • 在不想执行的单元格前添加if==0:
  • 将这些单元格转换为原始单元格(但您将丢失已存储的输出!)

(see讨论在https://github.com/ipython/ipython/issues/2125

v7pvogib

v7pvogib3#

这里有一个简单而通用的解决方案,无需变通方法:只需键入以下内容作为单元格的顶行即可跳过该单元格:

%%script echo skipping

它已经在Windows和Mac上用最近的Jupyter进行了测试,我认为它也应该能在其他类Unix平台上工作,因为它们也有一个echo命令。其他一些提议的解决方案更具有平台特定性。
当然,你可以把任何你喜欢的文本,而不是“跳过”。当您执行单元格时,它只会打印此文本,而不会执行单元格中的代码。

wtzytmuj

wtzytmuj4#

如果不希望加载缓存结果,我发现Freeze nbextension在这方面非常有用。

虽然非官方的,我强烈建议给予这些笔记本扩展一个尝试,如果你从来没有使用过他们之前。
为了安装延伸机械,

$ pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install

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

xdnvmnnf

xdnvmnnf5#

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

  • 安装NBextensions:here
  • 启动Jupyter Jmeter 板时激活“初始化单元格”
  • 在笔记本中,在“视图”菜单中选择“单元格工具栏”,然后选择“初始化单元格”
  • 现在每个单元格旁边都有一个复选框。标记所有要运行以进行初始化的单元格
  • 重新打开笔记本时,单击看起来像袖珍计算器的按钮以运行所有初始化单元格。
pwuypxnk

pwuypxnk6#

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

i7uq4tfw

i7uq4tfw7#

%%script false解决方案在2019年的某个时候停止工作。
以下是一些其他可用的解决方法。这些都是基于当你告诉程序不要期望任何参数时,程序会忽略它们的参数。下面是一些简单的例子:
Perl:

%%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:

%%bash -c :

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

:在bash中是无操作的,所以你运行:bash -c : cellcontents
我还没有看过外部的魔术实现代码,但我很确定“cellcontents”是作为参数传递的,不会被shell错误地解释,比如说如果你要在其中包含;并意外地注入一些错误的代码。但我不能保证。
我相信你可以想出其他创造性的解决方案,通过查看这里支持的程序:https://ipython.readthedocs.io/en/stable/interactive/magics.html#cell-magics

33qvvth1

33qvvth18#

对于按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')

第一次运行此单元格时,它将尝试打印状态变量my_results的值。这会抛出一个异常,因此它会跳转到except块,并执行my_results的实际计算(在本例中,这只会使其等同于2)。在第一次运行结束时,该单元格的输出将是:

2
displayed newly calculated value

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

2
displayed state value

这并不满足完全跳过单元格的显式条件,但实际上跳过了计算。
如果信息的显示比使用单个printdisplay更复杂,那么将显示例程转换为如下函数可能会更清晰:

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)
w8f9ii69

w8f9ii699#

我用的是最简单的方法。只需添加%作为单元格的第一个字符,此单元格将被跳过。缺点:错误信息(单元格下的一行)将显示,但它不会对运行其他单元格造成任何麻烦。优点:它对特定细胞的开/关速度很快。

相关问题