我想使用预处理器来运行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尝试一下。首先,无需任何预处理:
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。那为什么不起作用?
答案 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)