使用nbconvert作为库运行预处理器

时间:2019-10-25 19:07:18

标签: jupyter-notebook nbconvert

我想使用预处理器来运行nbconvert,该预处理器将删除标记为“ skip”的单元格。我可以从命令行执行此操作,但是当我尝试在笔记本中使用nbconvert API时,就会遇到问题。

一个例子

按照documentation中的示例,我可以使用一个笔记本。

from urllib.request import urlopen

url = 'http://jakevdp.github.com/downloads/notebooks/XKCD_plots.ipynb'
response = urlopen(url).read().decode()

import nbformat
nb = nbformat.reads(response, as_version=4)

我将修改一个单元格,使其在输出中被跳过。

nb.cells[1].metadata = {'tags': ['skip']}

命令行

保存文件,然后从命令行运行nbconvert:

nbformat.write(nb, 'nb.ipynb')

%%bash
jupyter nbconvert --to latex \
--TagRemovePreprocessor.remove_cell_tags='{"skip"}' \
--TagRemovePreprocessor.enabled=True \
'nb.ipynb'

这有效。输出nb.tex文件不包含标记为“跳过”的单元格。

API

现在让我们改用API尝试一下。首先,无需任何预处理:

import nbconvert
latex, _ = LatexExporter().from_notebook_node(nb)
print(latex[:25])
  

\ documentclass [11pt] {arti

再次,没问题。转换正常。

现在,尝试使用与从命令行使用的相同的预处理器:

from traitlets.config import Config

c = Config()
c.RemovePreprocessor.remove_cell_tags = ('skip',)
c.LatexExporter.preprocessors = ['TagRemovePreprocessor']

LatexExporter(config=c).from_notebook_node(nb)

这次,我得到:

  

ModuleNotFoundError:没有名为“ TagRemovePreprocessor”的模块

据我所知,此代码与code sample in the documentation匹配,除了我使用的是Latex导出器而不是HTML。那为什么不起作用?

1 个答案:

答案 0 :(得分:1)

对于您的特定情况,我相信您可以通过以下方法解决此问题:c.RemovePreprocessor.remove_cell_tags = ('skip',)-> c.TagRemovePreprocessor.remove_cell_tags = ('skip',)


为了像我通过搜索那样遇到此线程的其他人受益

ModuleNotFoundError: No module named 'TagRemovePreprocessor'

有一个TagRemovePreprocessor和一个open issue,导致除HTMLExporter(和LatexExporter?)以外的所有导出程序都自动禁用此预处理器。

在我的情况下,我试图使用NotebookExporter,并且需要显式启用预处理器并更改预处理级别,如下所示:

import json
from traitlets.config import Config
from nbconvert import NotebookExporter
import nbformat

c = Config()
c.TagRemovePreprocessor.enabled=True # Add line to enable the preprocessor
c.TagRemovePreprocessor.remove_cell_tags = ["del_cell"]
c.preprocessors = ['TagRemovePreprocessor'] # Was previously: c.NotebookExporter.preprocessors

nb_body, resources = NotebookExporter(config=c).from_filename('notebook.ipynb')
nbformat.write(nbformat.from_dict(json.loads(nb_body)),'stripped_notebook.ipynb',4)