Python_Jupyter_ Автоматически выполнять jupyter

Jupyter

В последнее время появились бизнес-потребности: при написании 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

документация jupyter nbconver

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
    • PDF
    • 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 generates NOTEBOOK_NAME.texfile, 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.

PDF

  • --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 обычно сохраняются с очищенными ячейками вывода.nbconvert обеспечивает удобный способ выполнения.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 будут выполняться при отображении записной книжки, благодаря чему сложные взаимодействия будут работать должным образом при просмотре в пользовательском интерфейсе.

Если вы не видите результаты виджета после выполнения, вам может потребоваться выбрать «Доверять блокноту» в меню «Файл».