[英]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 上的讨论)
雅各布
这是一个简单而通用的解决方案,无需解决方法:只需将其作为单元格的第一行键入即可跳过单元格:
%%script 回声跳过
它在 Windows 和 Mac 上使用最近的 Jupyter 进行了测试,我认为它也应该适用于其他类 Unix 平台,因为它们也有一个 echo 命令。 其他一些提议的解决方案更加特定于平台。
当然,您可以输入您喜欢的任何文字,而不是“跳过”。 当您执行单元格时,它只会打印此文本而不是执行单元格中的代码。
这个问题有点老了,但似乎缺少最方便的答案。 您可以使用 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
这不符合您应该完全跳过单元格的明确标准,但实际上跳过了计算。
如果信息的显示比使用单个print
或display
更复杂,如果将显示例程变成 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.