当重新打开笔记本时,我通常不得不重新运行(大部分)笔记本,以便访问以前定义的变量并继续工作。
但是,有时我想跳过一些单元格,这些单元格对后续单元格没有影响(例如,它们可能包含已完成的分析分支),并且可能需要很长时间才能运行。这些单元格可以分散在整个笔记本中,所以类似“运行下面的所有内容”之类的东西不会有太大帮助。
有没有办法做到这一点?
理想情况下,这些单元格可以用一些特殊的标志来标记,以便它们可以手动“运行”,但在“全部运行”时将被跳过。
编辑
@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$'))
9条答案
按热度按时间fdbelqdn1#
虽然这并不是你想要的,但如果你想完全省略单元格的执行(其中没有加载缓存结果),你可以在单元格的开头添加以下技巧(假设你使用的是基于Unix的操作系统):
或变体(2020年初开始工作-请参阅此处了解解释):
lymnna712#
目前,IPython notebook中还没有包含这样的功能。然而,有一些可能性可以让你的生活更轻松,比如:
%store
或者更好的%%cache
magic(扩展)来存储这些间歇性单元格的结果,因此它们不必重新计算(请参见https://github.com/rossant/ipycache)if==0:
(see讨论在https://github.com/ipython/ipython/issues/2125)
v7pvogib3#
这里有一个简单而通用的解决方案,无需变通方法:只需键入以下内容作为单元格的顶行即可跳过该单元格:
它已经在Windows和Mac上用最近的Jupyter进行了测试,我认为它也应该能在其他类Unix平台上工作,因为它们也有一个
echo
命令。其他一些提议的解决方案更具有平台特定性。当然,你可以把任何你喜欢的文本,而不是“跳过”。当您执行单元格时,它只会打印此文本,而不会执行单元格中的代码。
wtzytmuj4#
如果不希望加载缓存结果,我发现
Freeze
nbextension在这方面非常有用。虽然非官方的,我强烈建议给予这些笔记本扩展一个尝试,如果你从来没有使用过他们之前。
为了安装延伸机械,
要启用
Freeze
扩展,请启动jupyter notebook
并打开一个新笔记本,从菜单中选择Edit
>nbextensions config
,然后选中Freeze
。xdnvmnnf5#
这个问题有点老了,但最方便的答案似乎不见了。您可以使用NBextensions中的“初始化单元格”。一旦安装/激活,您可以在任何笔记本中将单元格标记为“初始化单元格”,然后可以使用特定按钮运行。
pwuypxnk6#
在jupyter notebook单元格中跳过python代码的最简单方法是,我暂时将这些单元格转换为markdown。
i7uq4tfw7#
%%script false
解决方案在2019年的某个时候停止工作。以下是一些其他可用的解决方法。这些都是基于当你告诉程序不要期望任何参数时,程序会忽略它们的参数。下面是一些简单的例子:
Perl:
你在跑:
perl -e '0' cellcontents
更令人难忘的版本:
你在跑:
perl -e 'at' cellcontents
Bash:
:
在bash中是无操作的,所以你运行:bash -c : cellcontents
我还没有看过外部的魔术实现代码,但我很确定“cellcontents”是作为参数传递的,不会被shell错误地解释,比如说如果你要在其中包含
;
并意外地注入一些错误的代码。但我不能保证。我相信你可以想出其他创造性的解决方案,通过查看这里支持的程序:https://ipython.readthedocs.io/en/stable/interactive/magics.html#cell-magics
33qvvth18#
对于按
Run All
时希望跳过的单元格,可以使用try
/except
块,在其中尝试在try
块中显示已计算的信息,并在except
块中执行计算。以这个细胞为例:
要在后续运行中跳过此单元格的计算,请将此单元格的内容更改为以下内容:
第一次运行此单元格时,它将尝试打印状态变量
my_results
的值。这会抛出一个异常,因此它会跳转到except
块,并执行my_results
的实际计算(在本例中,这只会使其等同于2
)。在第一次运行结束时,该单元格的输出将是:当您第二次运行单元格时(无论是手动还是通过
Run All
),try
块将首先执行,但这一次由于变量在状态中可用,因此不会抛出异常。相反,它会显示结果,并且except
块永远不会运行。在第二次运行结束时,该单元的输出将是:这并不满足完全跳过单元格的显式条件,但实际上跳过了计算。
如果信息的显示比使用单个
print
或display
更复杂,那么将显示例程转换为如下函数可能会更清晰:w8f9ii699#
我用的是最简单的方法。只需添加%作为单元格的第一个字符,此单元格将被跳过。缺点:错误信息(单元格下的一行)将显示,但它不会对运行其他单元格造成任何麻烦。优点:它对特定细胞的开/关速度很快。