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

时间:2014-10-21 19:29:25

标签: ipython ipython-notebook

我有一个ipython笔记本,它在数据处理程序中运行几个步骤,并在整个过程中将信息保存在文件中。这样,在开发我的代码时(主要是在一个单独的.py模块中),我可以跳过并运行各种步骤。我想将其设置为Cell - > run all,但只能让它执行一些易于选择的选定步骤。例如,我设想定义我想在dict中运行的步骤:

process = {
    'load files':False,
    'generate interactions list':False,
    'random walk':True,
    'dereference walk':True,
    'reduce walk':True,
    'generate output':True
}

然后步骤将基于此dict运行。顺便说一句,每个步骤包括多个细胞。

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

是否有%skip%skipto魔法或类似的东西?或者也许是放在单元格开头的干净方法if process[<current step>]: %dont_run_rest_of_cell

7 个答案:

答案 0 :(得分:8)

您可以借助自定义内核扩展来创建自己的跳过魔术。

<强> skip_kernel_extension.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

在要跳过的单元格中运行skip magic命令:

%%skip True  #skips cell
%%skip False #won't skip

您可以使用变量来决定是否应使用$:

跳过单元格
should_skip = True
%%skip $should_skip

答案 1 :(得分:3)

如果您使用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”关键字映射到笔记本元数据中的部分ID。

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

有关详细信息,请参阅the docs on Notebook preprocessors

答案 2 :(得分:2)

我是Jupyter笔记本的新手并且非常喜欢它。我之前听说过IPython,但在最近的咨询工作之前没有认真对待它。

我的同事告诉我禁用执行块的一个技巧是将它们从“代码”类型更改为“原始NBConvert”类型。这样我就可以通过我的笔记本喷洒诊断块了,但是如果我想让它们运行的​​话,只能将它们打开(使它们成为“代码”)。

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

答案 3 :(得分:0)

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

每步可以执行一个单元格:

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

if process['generate interactions list']:
    do_something_else()

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

if not process['reduce walk']:
    stop
else:
    reduce_walk()
    ...

stop不是命令,因此它会生成异常并在使用 Cell - &gt;时停止执行。全部运行

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

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

但是,根据经验,我不会制造比这更复杂的条件。

答案 4 :(得分:0)

您可以在元数据中使用nbconvert和tags选项: 就我而言,我编辑了单元格元数据:

{
    "deletable": true,
    "colab_type": "code",
    "id": "W9i6oektpgld",
    "tags": [
        "skip"
    ],
    "colab": {},
    "editable": true
}

创建一个preprocess.py文件。

from nbconvert.preprocessors import Preprocessor

class RemoveCellsWithNoTags(Preprocessor):
    def preprocess(self, notebook, resources):
        executable_cells = []
        for cell in notebook.cells:
            if cell.metadata.get('tags'):
                if "skip" in cell.metadata.get('tags'):
                    continue
            executable_cells.append(cell)
        notebook.cells = executable_cells
        return notebook, resources

然后导出笔记本:

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

答案 5 :(得分:0)

除了上面提到的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 :(得分:0)

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

%%script echo skipping