最近有业务需求,用户经过写jupyter文档,须要咱们天天定时执行,并将执行结果已图片的方式,发送给用户。javascript
jupyter nbconvert --ExecutePreprocessor.timeout=600 --to notebook --execute mynotebook.ipynb
方式执行jupyter 文件nbconvert --to html
命令,将执行成功的jupyter文件转成htmlnbconvert
能够作:
该nbconvert
工具主要能够将Jupyter ipynb
笔记文档转成另一个种静态格式,包括Html ,LaTex,PDF,Maketdown,reStructuredText等。nbconvert
当用于以编程方式执行笔记本时,还能够为您的工做流程增长工做效率。java
运行nbconvert
脚本的命令行语法是:python
$ jupyter nbconvert --to FORMAT notebook.ipynb
复制代码
将jupyter笔记本文件notebook.ipynb
转换成 FORMAT
字符串给出的输出格式。jquery
默认输出格式为HTML ,--to
可省略参数git
$ jupyter nbconvert notebook.ipynb
复制代码
--to html
--tempplate full
(默认) : 笔记本的完整静态HTML渲染。这看起来分红相似于交互视图--template basic
:简化的HTML,适用于嵌入网页、博客等。这不包含HTML表头--to latex
Latex export. This generates NOTEBOOK_NAME.tex
file, ready for export. Images are output as .png files in a folder.
--template article
(default) Latex article, derived from Sphinx’s howto template.--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.github
--to pdf
--to latex
--to slides
这会生成Reveal.js HTML幻灯片。运行此幻灯片须要一份reveal.js(版本3.x)的副本。正则表达式
默认状况下,这将在html中包含一个脚本标记,它将直接从公共CDN加载reveal.js。shell
这意味着若是您将幻灯片包含在网页上,它们应该按预期工做。可是,某些功能(特别是演讲者备注和计时器)不适用于网站,由于它们须要访问reveal.js的本地副本。编程
演讲者笔记须要reveal.js的本地副本。而后,您须要告诉 nbconvert如何找到本地副本。
定时器仅在您已有发言人注释时才有效,但也须要本地https服务器。您能够在ServePostProcessorExample中阅读有关此内容的更多信息。
为了更清楚,让咱们看一个如何使用reveal.js的本地副本获取演讲者笔记的示例:SlidesWithNotesExample。
注意
要从Jupyter笔记本中指定从笔记本单元格到Reveal.js幻灯片的映射,请选择菜单项View - > Cell Toolbar - > Slideshow。这将显示每一个单元格右上角的下拉菜单。从中,能够选择“幻灯片”,“子幻灯片”,“片断”,“跳过”和“注释”。在转换时,将不包括指定为“跳过”的单元格,将包含“注释”只在演示者笔记等
假设您有一个your_talk.ipynb
要转换为幻灯片的笔记本。对于此示例,咱们假设您在与要转换的笔记本相同的目录中工做(即,当您运行时, 显示在文件列表中)。ls .your_talk.ipynb
首先,咱们须要与幻灯片位于同一目录中的reveal.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
注意:这不会启用彻底脱机运行的幻灯片。虽然您有reveal.js的本地副本,但默认状况下,幻灯片须要经过公共CDN访问mathjax,require和jquery。解决这个用例是一个悬而未决的问题,而且老是鼓励PR。
--post serve
一旦你有说话笔记工做,你可能会注意到你的计时器不起做用。定时器须要更多的基础设施; 您须要从本地https服务器提供reveal.js的本地副本。
幸运的是,nbconvert
经过使用它,这使得至关简单ServePostProcessor
。要激活此服务器,咱们将命令行标志附加到咱们对nbconvert的调用。--post serve
jupyter nbconvert your_talk.ipynb --to slides --reveal-prefix reveal.js --post serve
复制代码
这将运行服务器,它将占用您运行命令的终端,直到您中止它。您能够按 两次中止服务器。ctrl C
--to markdown
简单的降价输出。Markdown单元格不受影响,代码单元格缩进4个空格。图像以.png文件形式输出到文件夹中。
--to asciidoc
Ascii输出。图像以.png文件形式输出到文件夹中。
--to rst
基本的reStructuredText输出。有用做为在Sphinx文档中嵌入笔记本的起点。图像以.png文件形式输出到文件夹中。
注意
nbconvert使用pandoc在各类标记语言之间进行转换,所以pandoc是转换为LaTeX或reStructuredText时的依赖项。
--to script
将笔记本转换为可执行脚本。这是从笔记本中获取Python(或其余语言,取决于内核)脚本的最简单方法。若是Jupyter笔记本中有任何魔法,这可能只能在Jupyter会话中执行。
例如,要将Julia笔记本转换为Julia可执行脚本:
jupyter nbconvert --to script my_julia_notebook.ipynb
复制代码
--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
in 的副本mynotebook.v3.ipynb
。
若是要就地转换笔记本,能够将输出文件指定为与输入文件相同:
jupyter nbconvert --to notebook mynb --output mynb
复制代码
要当心,由于它将替换输入文件。
注意
nbconvert使用pandoc在各类标记语言之间进行转换,所以pandoc是转换为latex或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
复制代码
将笔记本电脑转换为其余格式时,可使用预处理器删除单元格的一部分或整个单元格。笔记本将保持不变,但输出将删除某些部分。如下是实现此目的的两种主要方法。
控制哪些单元格被移除的最直接的方法是使用细胞标签。这些是存储在每一个单元格“tag”字段中的单字符串元数据片断。的 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库中运行全部笔记本,或者做为在涉及多个笔记本的项目中自动执行数据分析的方法。
执行笔记本的相同功能经过命令行界面或Python API接口公开 。例如,能够从命令行执行笔记本:
jupyter nbconvert --to notebook --execute mynotebook.ipynb
复制代码
本节将说明Python API接口。
让咱们从一个完整的快速示例开始,给出如下部分的详细说明。
导入:首先咱们导入nbconvert
和ExecutePreprocessor
类:
import nbformat
from nbconvert.preprocessors import ExecutePreprocessor
复制代码
加载:假设notebook_filename包含笔记本的路径,咱们能够加载它:
with open(notebook_filename) as f:
nb = nbformat.read(f, as_version=4)
复制代码
配置:接下来,咱们配置笔记本执行模式:
ep = ExecutePreprocessor(timeout=600, kernel_name='python3')
复制代码
咱们指定的两个(可选的)参数timeout
和kernel_name
,分别定义单元格执行超时和执行内核。
指定kernel_name的选项是nbconvert 4.2中的新选项。未指定或使用nbconvert <4.2时,将选择默认的Python内核。
执行/运行(预处理):要实际运行笔记本,咱们调用方法 preprocess
:
ep.preprocess(nb, {'metadata': {'path': 'notebooks/'}})
复制代码
但愿咱们在笔记本执行期间不会出现任何错误(请参阅最后一节的错误处理)。请注意,path指定在哪一个文件夹中执行笔记本。
保存:最后,保存生成的笔记本:
with open('executed_notebook.ipynb', 'w', encoding='utf-8') as f:
nbformat.write(nb, f)
复制代码
就这样。您执行的笔记本将保存在文件的当前文件夹中executed_notebook.ipynb。
传递给的参数ExecutePreprocessor
是名为traitlets的配置选项。关于traitlets有不少很酷的事情。例如,它们强制执行输入类型,而且能够做为类属性访问/修改它们。此外,每一个traitlet都会自动做为命令行选项公开。例如,咱们能够从命令行传递超时,以下所示:
jupyter nbconvert --ExecutePreprocessor.timeout=600 --to notebook --execute mynotebook.ipynb
复制代码
如今让咱们更详细地讨论咱们使用的两个特征。
所述timeout
traitlet定义最大时间(秒)每笔记本cell容许运行,若是执行须要较长的时间,则将会引起。默认值为30秒,所以在长时间运行的单元格中,您可能须要指定更高的值。该timeout选项也能够设置为None 或-1删除对执行时间的任何限制。
第二个traitlet kernel_name
容许指定要用于执行的内核的名称。默认状况下,内核名称是从笔记本元数据中获取的。traitlet kernel_name
容许指定用户定义的内核,覆盖笔记本元数据中的值。一个常见的用例是Python 2/3
库,其中包括文档/测试笔记本。这些笔记本将在其元数据中指定python2
或python3
内核(取决于上次保存笔记本时使用的内核)。实际上,这些笔记本将适用于Python 2
和Python 3
,而且,为了进行测试,可以在两个版本上以编程方式执行它们很是重要。这里的traitletkernel_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引起该消息 。该消息将用户指向已保存的笔记本以供进一步检查。
做为最后一种状况,执行引起异常的笔记本有时颇有用,例如显示错误状况。在这种状况下,咱们可使用traitlet继续执行笔记本,而不是在第一个错误上中止执行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单元格将在笔记本呈现时执行,使复杂的交互在UI查看时按预期运行。
若是在执行后没法查看窗口小部件结果,则可能须要在“ 文件”菜单下选择“ 信任笔记本 ”