选择在“全部运行”期间在ipython笔记本中运行哪些单元格的简单方法

选择在“全部运行”期间在ipython笔记本中运行哪些单元格的简单方法,ipython,ipython-notebook,Ipython,Ipython Notebook,我有一个ipython笔记本,它在数据处理例程中运行几个步骤,并将信息保存在文件中。这样,在开发代码时(主要在单独的.py模块中),我可以跳到并运行各种步骤。我想对它进行设置,这样我就可以单元格->运行所有的,但只让它执行某些容易选择的步骤。e、 例如,我设想在dict中定义我想要运行的步骤,如下所示: process = { 'load files':False, 'generate interactions list':False, 'random walk':Tru

我有一个ipython笔记本,它在数据处理例程中运行几个步骤,并将信息保存在文件中。这样,在开发代码时(主要在单独的.py模块中),我可以跳到并运行各种步骤。我想对它进行设置,这样我就可以
单元格
->
运行所有的
,但只让它执行某些容易选择的步骤。e、 例如,我设想在dict中定义我想要运行的步骤,如下所示:

process = {
    'load files':False,
    'generate interactions list':False,
    'random walk':True,
    'dereference walk':True,
    'reduce walk':True,
    'generate output':True
}
然后这些步骤将基于该指令运行。顺便说一句,每个步骤包括多个单元

我认为
%macro
不是我想要的,因为每当我更改任何内容或重新启动内核时,我都必须通过更改单元格编号来重新定义宏


有没有像
%skip
%skipto
这样的魔法或类似的东西?或者可能是一种干净的方式,将单元格的开头放在“
if process[]:%not\u run\u rest\u of \u cell”

显式总是比隐式好。简单总比复杂好。那么为什么不使用普通python呢

使用每个步骤一个单元格,您可以执行以下操作:

if process['load files']:
    load_files()
    do_something()

如果要在跳过特定步骤时停止执行,可以使用:

if not process['reduce walk']:
    stop
else:
    reduce_walk()
    ...
stop
不是命令,因此在使用Cell->Run all时,它将生成异常并停止执行

您还可以执行以下条件步骤:

if process['reduce walk'] and process['save output']:
    save_results()
    ...

但是,根据经验,我不会设置比这复杂得多的条件。

如果您使用nbconvert来执行笔记本,您可以编写一个自定义预处理器,查看单元格元数据以了解要执行的单元格

class MyExecutePreprocessor(nbconvert.preprocessors.ExecutePreprocessor):

    def preprocess_cell(self, cell, resources, cell_index):
        """
        Executes a single code cell. See base.py for details.
        To execute all cells see :meth:`preprocess`.

        Checks cell.metadata for 'execute' key. If set, and maps to False, 
          the cell is not executed.
        """

        if not cell.metadata.get('execute', True):
            # Don't execute this cell in output
            return cell, resources

        return super().preprocess_cell(cell, resources, cell_index)
通过编辑单元格元数据,可以指定是否应执行该单元格

通过在笔记本元数据中添加主词典,您可以变得更加有趣。这看起来像示例中的字典,将节映射到指定是否调用该节的布尔值

然后,在单元格元数据中,可以使用“section”关键字映射到笔记本元数据中的section ID

在执行nbconvert时,您可以告诉它使用预处理器


有关更多信息,请参阅。

您可以在自定义内核扩展的帮助下创建自己的skip magic

跳过内核扩展.py

def skip(line, cell=None):
    '''Skips execution of the current line/cell if line evaluates to True.'''
    if eval(line):
        return

    get_ipython().ex(cell)

def load_ipython_extension(shell):
    '''Registers the skip magic when the extension loads.'''
    shell.register_magic_function(skip, 'line_cell')

def unload_ipython_extension(shell):
    '''Unregisters the skip magic when the extension unloads.'''
    del shell.magics_manager.magics['cell']['skip']
在笔记本中加载扩展名:

%load_ext skip_kernel_extension
jupyter nbconvert --Exporter.preprocessors=[\"preprocess.RemoveCellsWithNoTags\"] --ClearOutputPreprocessor.enabled=True --to notebook --output=getting-started-keras-test getting-started-keras.ipynb
在要跳过的单元格中运行skip magic命令:

%%skip True  #skips cell
%%skip False #won't skip
您可以使用变量来决定是否应使用$跳过单元格:

should_skip = True
%%skip $should_skip

我不熟悉Jupyter笔记本,我很喜欢它。我以前听说过IPython,但直到最近的一份咨询工作,我才认真研究它

我的同事向我展示的一个禁用块执行的技巧是将它们从“代码”类型更改为“原始NBConvert”类型。通过这种方式,我可以在笔记本中散布诊断块,但只有在我希望它们运行时才打开它们(使它们成为“代码”)


此方法在脚本中不能完全动态选择,但可能适合某些需要。

您可以在元数据中使用nbconvert和tags选项: 在我的例子中,我编辑了单元格元数据:

{
    "deletable": true,
    "colab_type": "code",
    "id": "W9i6oektpgld",
    "tags": [
        "skip"
    ],
    "colab": {},
    "editable": true
}
创建一个
preprocess.py
文件

从nbconvert.preprocessors导入预处理器
类RemoveCellsWithNoTags(预处理器):
def预处理(自我、笔记本、资源):
可执行_单元=[]
对于notebook.cells中的单元格:
如果cell.metadata.get('tags'):
如果在cell.metadata.get('tags')中“跳过”:
持续
可执行单元格。追加(单元格)
notebook.cells=可执行单元
归还笔记本、资源
然后导出笔记本:

%load_ext skip_kernel_extension
jupyter nbconvert --Exporter.preprocessors=[\"preprocess.RemoveCellsWithNoTags\"] --ClearOutputPreprocessor.enabled=True --to notebook --output=getting-started-keras-test getting-started-keras.ipynb

除了Robbe上面所说的(我不能评论,因为我是新来的),如果您不想创建一个可能会忘记的自定义扩展,您可以在第一个单元格中执行以下操作:

def skip(line, cell=None):
    '''Skips execution of the current line/cell if line evaluates to True.'''
    if eval(line):
        return

    get_ipython().ex(cell)

def load_ipython_extension(shell):
    '''Registers the skip magic when the extension loads.'''
    shell.register_magic_function(skip, 'line_cell')

def unload_ipython_extension(shell):
    '''Unregisters the skip magic when the extension unloads.'''
    del shell.magics_manager.magics['cell']['skip']
    
    
load_ipython_extension(get_ipython())

或者从另一个角度来看,您可以跳过不想运行的单元格(即,在需要跳过的单元格的第一行添加以下代码)


我也有同样的需求——我使用笔记本作为自动生成报告的模板。我希望能够根据某些条件定义笔记本的哪些部分被执行,例如某个输入文件是否存在(即,如果提供了该文件,则运行接下来的6个单元格)。这个想法让我想起了C族语言中的#define,#ifdef编译器宏。在回答这个相关问题时,我补充了一些细节:。谢谢@Gordon Bean。编辑单元格元数据最方便的方法是什么?有没有办法在Jupyter笔记本中使用命令执行此操作?@colorlessgreenidea-您可以通过笔记本编辑器编辑元数据。我不确定是否有办法使用命令编辑元数据(尽管这听起来是一个很好的问题)。很酷,但是“自定义内核扩展”放在哪里呢?@Arthur:你可以将扩展模块放在任何你想要的地方,只要它们可以通过Python的标准导入机制导入。但是,为了便于编写扩展,还可以将扩展放在IPython目录的extensions/中。此目录将自动添加到sys.path。