В последнее время появились бизнес-потребности: при написании jupyter-документов пользователям необходимо выполнять их регулярно каждый день, а результаты выполнения отправлять пользователям в виде картинок.
решение
- 1. Ежедневно читайте исходный файл .ipynb, чтобы создать новый .ipynb.
- 2. Через pythonApi или командную строку
jupyter nbconvert --ExecutePreprocessor.timeout=600 --to notebook --execute mynotebook.ipynb
способ выполнить файл jupyter - 3. Пройти
nbconvert --to html
команда для преобразования успешно выполненного файла jupyter в html - 4. Selenium+PhantomJS читает html файл и сохраняет его как картинку
- 5. Отправка пользователям через DingTalk API
- 6. Приведенный выше график выполняется через jenkins.
Python_Jupyter_Nbconvert
nbconvert: конвертировать jupyter в другие форматы
- использовать
nbconvert
сможет сделать:- Представляйте информацию в знакомом формате, таком как PDF.
- Публикация исследований с помощью LaTeX открывает двери для встраивания блокнотов в бумагу.
- Сотрудничайте с другими людьми, которые могут не использовать ноутбуки на работе.
- Делитесь контентом со многими людьми через Интернет с помощью HTML.
Долженnbconvert
Инструмент в основном конвертирует Jupyteripynb
Документ заметки преобразуется в другой статический формат, включая Html, LaTex, PDF, Maketdown, reStructuredText и т. д.nbconvert
При использовании для программного запуска блокнотов он также может повысить производительность вашего рабочего процесса.
инструмент командной строки
бегатьnbconvert
Синтаксис командной строки для скрипта:
$ jupyter nbconvert --to FORMAT notebook.ipynb
Поместите файл блокнота jupyternotebook.ipynb
преобразовать вFORMAT
Выходной формат, заданный строкой.
Формат вывода по умолчанию html
Выходной формат по умолчанию — HTML,--to
параметр можно не указывать
$ jupyter nbconvert notebook.ipynb
Поддерживаемые форматы вывода
- В настоящее время поддерживаются форматы вывода:
- HTML
- LaTeX
- Reveal.js HTML slideshow
- Markdown
- Ascii
- reStructruredText
- executable script
- notebook
HTML
-
--to html
-
--tempplate full
(по умолчанию): полный статический HTML-рендеринг блокнота. Это выглядит разделенным на интерактивный вид, похожий на -
--template basic
: упрощенный HTML, подходящий для встраивания в веб-страницы, блоги и т. д. Это не содержит заголовков HTML
-
LaTex
-
--to latex
Latex export. This generatesNOTEBOOK_NAME.tex
file, ready for export. Images are output as .png files in a folder.-
--template article
(по умолчанию) Статья о латексе, созданная на основе шаблона Howto Sphinx. -
--template report
Latex report, providing a table of contents and chapters.
-
nbconvert uses pandoc to convert between various markup languages, so pandoc is a dependency when converting to latex or reStructuredText.
--to pdf
- Сгенерируйте PDF через LaTex. Тот же шаблон поддерживается.
--to latex
HTML-слайд-шоу Reveal.js
-
--to slides
Это создает слайд-шоу Reveal.js HTML.
Для запуска этого слайд-шоу требуется копия manifest.js (версия 3.x).
По умолчанию это будет включать в себя тег скрипта в html, который будет загружать manifest.js непосредственно из общедоступного CDN.
Это означает, что если вы включите свои слайды на веб-страницу, они должны работать должным образом. Однако некоторые функции (в частности, заметки докладчика и таймеры) не работают с веб-сайтами, поскольку для них требуется доступ к локальной копии файла reject.js.
Для заметок докладчика требуется локальная копия файла reject.js. Затем вам нужно сообщить nbconvert, как найти локальную копию.
Таймер работает только в том случае, если у вас уже есть аннотация докладчика, но также требуется локальный https-сервер. Подробнее об этом можно прочитать в ServePostProcessorExample.
Чтобы было понятнее, давайте рассмотрим пример получения заметок спикера с помощью локальной копии файла reject.js: SlidesWithNotesExample.
Уведомление
Чтобы указать сопоставление ячеек записной книжки со слайдами Reveal.js из записной книжки Jupyter, выберите пункт меню «Вид» -> «Панель инструментов ячейки» -> «Слайд-шоу». Это отобразит раскрывающееся меню в правом верхнем углу каждой ячейки. Оттуда вы можете выбрать слайды, вложенные слайды, фрагменты, пропуски и заметки. При преобразовании ячейки, обозначенные как «пропустить», не будут включены, «примечания» будут включены только в заметки докладчика и т. д.
Пример: Создайте слайд-шоу из your_talk.ipynb
Предположим, у вас естьyour_talk.ipynb
Блокнот для преобразования в слайд-шоу. В этом примере мы предполагаем, что вы работаете в том же каталоге, что и блокнот, который вы конвертируете (то есть, когда вы запускаете его, он появляется в списке файлов).ls .your_talk.ipynb
Во-первых, нам нужна копия файла reject.js в том же каталоге, что и слайд-шоу. Один из способов — использовать следующую команду в терминале:
git clone https://github.com/hakimel/reveal.js.git
cd reveal.js
git checkout 3.5.0
cd ..
Затем нам нужно сообщить nbconvert, чтобы он указывал на эту локальную копию. Для этого мы используем--reveal-prefix
Флаги командной строки указывают на локальную копию.
jupyter nbconvert your_talk.ipynb --to slides --reveal-prefix reveal.js
это создастyour_talk.slides.html
Файл, к которому у вас должен быть доступ. Чтобы получить доступ к заметкам докладчика, нажмите после загрузки слайдов, а затем откройте в новом окне.open your_talk.slides.html
Примечание. Это не позволит показывать слайд-шоу, которые работают полностью в автономном режиме. Несмотря на то, что у вас есть локальная копия reject.js, для слайд-шоу по умолчанию требуется доступ к mathjax, require и jquery через публичный CDN. Решение этого варианта использования является открытым вопросом, и PR всегда приветствуется.
Подавать слайды с помощью https-сервера:--post serve
Когда у вас заработают говорящие заметки, вы можете заметить, что ваш таймер не работает. Для таймеров требуется дополнительная инфраструктура, вам нужно обслуживать локальную копию раскрывания.js с локального https-сервера.
К счастью,nbconvert
Используя его, это делает его довольно простымServePostProcessor
. Чтобы активировать этот сервер, мы добавляем флаги командной строки к нашему вызову nbconvert.--post serve
jupyter nbconvert your_talk.ipynb --to slides --reveal-prefix reveal.js --post serve
Это запустит сервер, который будет занимать терминал, где вы запускаете команду, пока вы ее не остановите. Вы можете остановить сервер, нажав дважды.ctrl C
Markdown
--to markdown
Простой вывод уценки. Ячейки уценки не затрагиваются, ячейки кода имеют отступ в 4 пробела. Изображения выводятся в папку в виде файлов .png.
ASCII
--to asciidoc
ASCII-вывод. Изображения выводятся в папку в виде файлов .png.
reStructuredText
--to rst
Базовый вывод reStructuredText. Полезно в качестве отправной точки для встраивания блокнотов в документы Sphinx. Изображения выводятся в папку в виде файлов .png.
Уведомление
nbconvert использует pandoc для преобразования между различными языками разметки, поэтому pandoc является зависимостью при преобразовании в LaTeX или reStructuredText.
Executable script
--to script
Преобразование блокнотов в исполняемые скрипты. Это самый простой способ получить скрипт Python (или другого языка, в зависимости от ядра) из блокнота. Если в блокнотах Jupyter есть какая-то магия, это можно сделать только в сеансе Jupyter.
Например, чтобы преобразовать записную книжку Julia в исполняемый скрипт Julia:
jupyter nbconvert --to script my_julia_notebook.ipynb
Notebook and preprocessors
--to notebook
Новое в версии 3.0.
Это не преобразует сам блокнот в другой формат, но позволяет запускать препроцессор nbconvert на блокноте и/или преобразовывать его в другие форматы блокнота. Например:
jupyter nbconvert --to notebook --execute mynotebook.ipynb
Это откроет блокнот, выполнит его, захватит новый вывод и сохранит результат.mynotebook.nbconvert.ipynb
. уточнить--inplace
Будет перезаписывать входной файл вместо записи нового файла. По умолчанию nbconvert прервет преобразование, если во время выполнения ячейки возникнет какое-либо исключение. если указано--allow-errors
(кроме флага -execute`), преобразование будет продолжено, и любой аномальный вывод будет включен в вывод ячейки.
Следующие команды:
jupyter nbconvert --to notebook --nbformat 3 mynotebook
будет создан в версии 3 формата блокнотаmynotebook.ipynb
копия вmynotebook.v3.ipynb
.
Если вы хотите преобразовать блокнот на месте, вы можете указать, что выходной файл должен совпадать с входным файлом:
jupyter nbconvert --to notebook mynb --output mynb
Будьте осторожны, так как он заменит входной файл.
Уведомление
nbconvert использует pandoc для преобразования между различными языками разметки, поэтому pandoc является зависимостью при преобразовании в латекс или reStructuredText.
Созданный выходной файл nbconvert будет иметь то же базовое имя, что и блокнот, и будет помещен в текущий рабочий каталог. Любые вспомогательные файлы (графика и т. д.) будут помещены в новый каталог с тем же базовым именем, что и блокнот, с суффиксом _files:
$ jupyter nbconvert notebook.ipynb
$ ls
notebook.ipynb notebook.html notebook_files/
Для простого однофайлового вывода, такого как html, markdown и т. д., вывод может быть отправлен в стандартный вывод следующим образом:
$ jupyter nbconvert --to markdown notebook.ipynb --stdout
Преобразование нескольких блокнотов
Несколько блокнотов можно указать из командной строки:
$ jupyter nbconvert notebook*.ipynb
$ jupyter nbconvert notebook1.ipynb notebook2.ipynb
или через список в файле конфигурации, например.mycfg.py
, содержащий текст:
c = get_config()
c.NbConvertApp.notebooks = ["notebook1.ipynb", "notebook2.ipynb"]
и используйте команду:
$ jupyter nbconvert --config mycfg.py
удалить ячейку, ввод или вывод
При преобразовании блокнотов в другие форматы вы можете использовать препроцессор для удаления части ячейки или всей ячейки. Блокнот останется прежним, но некоторые части вывода будут удалены. Ниже приведены два основных способа добиться этого.
Удалить ячейки с помощью меток ячеек
Самый простой способ контролировать, какие ячейки удаляются, — это использовать метки ячеек. Это однострочные фрагменты метаданных, хранящиеся в поле «тег» каждой ячейки. TagRemovePreprocessor можно использовать для удаления ввода, вывода или целых ячеек.
Например, это другой тег для удаленияHTMLExporter
Конфигурация каждой секции клетки. В этом случае мы демонстрируем использованиеnbconvert Python API
.
from traitlets.config import Config
import nbformat as nbf
from nbconvert.exporters import HTMLExporter
c = Config()
# 配置我们的标签移除
c.TagRemovePreprocessor.remove_cell_tags = ("remove_cell",)
c.TagRemovePreprocessor.remove_all_outputs_tags = ('remove_output',)
c.TagRemovePreprocessor.remove_input_tags = ('remove_input',)
# Configure and run out exporter
c.HTMLExporter.preprocessors = ["TagRemovePreprocessor"]
HTMLExporter(config=c).from_filename("path/to/mynotebook.ipynb")
Удалить ячейку, используя регулярное выражение для содержимого ячейки
Иногда вы предпочитаете удалять ячейки на основе _content_, а не меток. В этом случае вы можете использоватьRegexRemovePreprocessor
.
Вы можете инициализировать этот препроцессор с помощью конфигурации одного шаблона, который представляет собой список строк. Для каждой ячейки этот препроцессор проверяет, соответствует ли содержимое ячейки любой из строк, представленных в шаблоне. Удаляет ячейку из записной книжки, если содержимое соответствует какому-либо шаблону.
Например, выполните следующую команду, чтобы преобразовать записную книжку в html и удалить ячейки, содержащие только пробелы:
jupyter nbconvert --RegexRemovePreprocessor.patterns="['\s*\Z']" mynotebook.ipynb
Аргумент командной строки задает для списка шаблонов значение 's*Z', которое соответствует любому количеству пробельных символов, за которыми следует конец строки.
Интерактивное руководство по регулярным выражениям см.https://regex101.com/
(обязательно выберите стиль Python). Официальную документацию по регулярному выражению в python см.https://docs.python.org/library、re.html
.
казнить юпитера
Блокноты Jupyter обычно сохраняются с очищенными ячейками вывода.nbconver
t обеспечивает удобный способ выполнения.ipynb
Введите ячейки файла записной книжки и сохраните результаты (входные и выходные ячейки) как.ipynb
документ.
В этом разделе мы покажем, как выполнять.ipynb
Документ блокнота для сохранения результатов в формате блокнота. Если вам нужно экспортировать записные книжки в другие форматы, такие как reStructured Text или Markdown (при необходимости реализовать их), см. раздел Использование nbconvert в качестве библиотеки.
Выполнение записных книжек полезно, например, для запуска всех записных книжек в библиотеке Python за один шаг или как способ автоматизации анализа данных в проектах, включающих несколько записных книжек.
Выполнить блокнот из командной строки
Те же функции для выполнения блокнотов доступны через интерфейс командной строки или интерфейс API Python. Например, блокнот можно запустить из командной строки:
jupyter nbconvert --to notebook --execute mynotebook.ipynb
Выполнение записных книжек с помощью интерфейса Python API
В этом разделе описывается интерфейс Python API.
Пример
Давайте начнем с полного быстрого примера, дающего подробное объяснение следующих разделов.
Импортировать: Сначала мы импортируемnbconvert
иExecutePreprocessor
своего рода:
import nbformat
from nbconvert.preprocessors import ExecutePreprocessor
нагрузка: Предполагая, что имя_файла_ноутбука содержит путь к блокноту, мы можем загрузить его:
with open(notebook_filename) as f:
nb = nbformat.read(f, as_version=4)
настроить: Далее настраиваем режим выполнения ноутбука:
ep = ExecutePreprocessor(timeout=600, kernel_name='python3')
Два (необязательных) параметра, которые мы указываемtimeout
иkernel_name
, которые определяют тайм-аут выполнения ячейки и ядро выполнения соответственно.
Возможность указать имя_ядра появилась в nbconvert 4.2. Если не указано или при использовании nbconvert
выполнить/запустить (предварительная обработка): Чтобы запустить записную книжку, мы вызываем методpreprocess
:
ep.preprocess(nb, {'metadata': {'path': 'notebooks/'}})
Надеюсь, мы не получим никаких ошибок во время выполнения блокнота (см. последний раздел об обработке ошибок). Обратите внимание, что путь указывает папку, в которой выполняется записная книжка.
спасти: Наконец, сохраните полученный блокнот:
with open('executed_notebook.ipynb', 'w', encoding='utf-8') as f:
nbformat.write(nb, f)
это все. Ваш выполненный блокнот будет сохранен в текущей папке файла execute_notebook.ipynb.
Параметры исполнения (трейтлеты)
параметры, переданныеExecutePreprocessor
это опция конфигурации, называемая признаками. В трейтлетах есть много крутых вещей. Например, они применяют типы ввода, и к ним можно получить доступ/изменить как атрибуты класса. Кроме того, каждый трейлет автоматически отображается как параметр командной строки. Например, мы можем передать тайм-аут из командной строки следующим образом:
jupyter nbconvert --ExecutePreprocessor.timeout=600 --to notebook --execute mynotebook.ipynb
Давайте теперь обсудим две функции, которые мы использовали более подробно.
сказалtimeout
Трейтлет определяет максимальное время (в секундах), разрешенное для запуска каждой ячейки записной книжки, и будет повышен, если выполнение займет много времени. Значение по умолчанию — 30 секунд, поэтому в длительных ячейках может потребоваться указать более высокое значение. Для параметра тайм-аута также можно установить значение None или -1, чтобы снять любые ограничения на время выполнения.
второй чертлетkernel_name
Позволяет указать имя ядра, которое будет использоваться для выполнения. По умолчанию имя ядра получается из метаданных записной книжки. трейлетkernel_name
Позволяет указывать пользовательские ядра, переопределяя значения в метаданных записной книжки. Обычный вариант использованияPython 2/3
Библиотеки, которые включают блокноты с документацией/тестами. Эти блокноты будут указаны в их метаданныхpython2
илиpython3
Ядро (в зависимости от того, какое ядро использовалось при последнем сохранении записной книжки). На самом деле, эти ноутбуки подойдут дляPython 2
иPython 3
, и в целях тестирования важно иметь возможность выполнять их программно в обеих версиях. Вот трейлетkernel_name
Чтобы помочь с простотой и последовательностью: мы можем запустить блокнот дважды, сначала указав "python2
", затем укажите "python3
" в качестве имени ядра.
Обработка ошибок и исключений
В предыдущем разделе мы видели, как сохранить выполненную записную книжку, предполагая, что ошибок выполнения не было. Но что, если есть ошибка?
Выполнить до первой ошибки
По умолчанию ошибки во время выполнения блокнота останавливают выполнение и выбрасываютCellExecutionError
. Для удобства также печатается исходный блок, вызвавший ошибку, а также исходное название ошибки и сообщение. После ошибки мы все еще можем сохранить блокнот, как и раньше:
with open('executed_notebook.ipynb', mode='w', encoding='utf-8') as f:
nbformat.write(nb, f)
Сохраненная записная книжка содержит выходные данные вплоть до сбойной ячейки с полными трассировками стека и ошибками (что может помочь при отладке).
обрабатывать ошибки
Полезные шаблоны для выполнения записных книжек при обработке ошибок:
from nbconvert.preprocessors import CellExecutionError
try:
out = ep.preprocess(nb, {'metadata': {'path': run_path}})
except CellExecutionError:
out = None
msg = 'Error executing the notebook "%s".\n\n' % notebook_filename
msg += 'See notebook "%s" for the traceback.' % notebook_filename_out
print(msg)
raise
finally:
with open(notebook_filename_out, mode='w', encoding='utf-8') as f:
nbformat.write(nb, f)
Это позволит сохранить выполненный блокнот независимо от ошибок выполнения. Однако в случае ошибки печатается дополнительное сообщение и возникает CellExecutionError. Сообщение указывает пользователю на сохраненную записную книжку для дальнейшего изучения.
Выполнить и сохранить все ошибки
В качестве последнего случая иногда полезно запустить записную книжку, которая выдает исключение, например, для отображения состояния ошибки. В этом случае вместо остановки выполнения allow_errors (по умолчанию False) при первой ошибке мы можем использовать трейтлет для продолжения выполнения блокнота. Если параметр allow_errors=True, записная книжка будет выполняться до конца независимо от любых ошибок, обнаруженных во время выполнения. Выходная записная книжка будет содержать трассировки стека и сообщения об ошибках для всех ячеек, вызвавших исключение.
состояние виджета
Если в вашей записной книжке есть какие-либо виджеты Jupyter, состояние всех виджетов можно сохранить в метаданных записной книжки. Это позволяет отображать живые виджеты, например, в nbviewer или при преобразовании в html.
мы можем сказатьnbconvert
Не используйstore_widget_state
Статус хранения параметров:
jupyter nbconvert --ExecutePreprocessor.store_widget_state=False --to notebook --execute mynotebook.ipynb
Этот рендеринг виджета не выполняется для браузера во время выполнения, поэтому во время выполнения будет вычисляться только состояние виджета по умолчанию или состояние, управляемое пользовательским кодом. Ячейки %%javascript будут выполняться при отображении записной книжки, благодаря чему сложные взаимодействия будут работать должным образом при просмотре в пользовательском интерфейсе.
Если вы не видите результаты виджета после выполнения, вам может потребоваться выбрать «Доверять блокноту» в меню «Файл».