Запустите препроцессор, используя nbconvert в качестве библиотеки - PullRequest
0 голосов
/ 25 октября 2019

Я хотел бы запустить 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

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

1 Ответ

1 голос
/ 26 октября 2019

Я полагаю, что в вашем конкретном случае вы можете решить эту проблему, изменив: c.RemovePreprocessor.remove_cell_tags = ('skip',) -> c.<strong>Tag</strong>RemovePreprocessor.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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...