Запустить препроцессор, используя nbconvert как библиотеку

Я хотел бы запустить nbconvert с препроцессором, который удаляет ячейки, отмеченные тегом «пропустить». Я могу сделать это из командной строки, но когда я пытаюсь использовать API nbconvert в записной книжке, у меня возникают проблемы.

Пример

Следуя примеру в документации, я получаю записную книжку работать с.

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

Насколько я понимаю, этот код соответствует пример кода в документации, за исключением того, что я использую экспортер Latex вместо HTML. Так почему это не работает?


person itzy    schedule 25.10.2019    source источник


Ответы (1)


В вашем конкретном случае я считаю, что вы можете решить проблему, изменив: c.RemovePreprocessor.remove_cell_tags = ('skip',) -> c.TagRemovePreprocessor.remove_cell_tags = ('skip',)


Для блага других, которые сталкиваются с этой веткой, как и я, выполнив поиск

ModuleNotFoundError: No module named 'TagRemovePreprocessor'

Существует открытая проблема с TagRemovePreprocessor, из-за которой все экспортеры, кроме HTMLExporterLatexExporter ?), чтобы автоматически отключить этот препроцессор.

В моем случае я пытался использовать 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)
person Bitwise    schedule 26.10.2019
comment
Спасибо. Мне также пришлось изменить c.LatexExporter.preprocessors на c.preprocessors, как в вашем примере. - person itzy; 28.10.2019
comment
и вы даже можете сделать это с той же записной книжкой, из которой вы удалили помеченную ячейку (здесь: del_cell)! - person mirekphd; 26.05.2020