Python_Jupyter_自動執行jupyter

最近有業務需求,用戶經過寫jupyter文檔,須要咱們天天定時執行,並將執行結果已圖片的方式,發送給用戶。javascript

解決方案

  • 1.天天讀取源文件.ipynb 生成 new.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.經過釘釘API發送給用戶
  • 6.以上調度 經過jenkins 執行。

Python_Jupyter_Nbconvert

jupyter nbconver文檔html

nbconvert:將jupyter 轉成其餘格式

  • 使用nbconvert能夠作:
    • 以熟悉的格式(如PDF)呈現信息。
    • 使用LaTeX 發佈研究並打開了將筆記本嵌入紙張的大門。
    • 協做與其餘人誰可能不會在工做中使用筆記本。
    • 使用HTML經過網絡與許多人分享內容。

nbconvert工具主要能夠將Jupyter ipynb 筆記文檔轉成另一個種靜態格式,包括Html ,LaTex,PDF,Maketdown,reStructuredText等。nbconvert當用於以編程方式執行筆記本時,還能夠爲您的工做流程增長工做效率。java

命令行工具

運行nbconvert腳本的命令行語法是:python

$ jupyter nbconvert --to FORMAT notebook.ipynb
複製代碼

將jupyter筆記本文件notebook.ipynb 轉換成 FORMAT字符串給出的輸出格式。jquery

默認輸出格式 html

默認輸出格式爲HTML ,--to 可省略參數git

$ 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 (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

PDF

  • --to pdf
  • 經過LaTex生成PDF。支持相同的模板。--to latex

Reveal.js HTML幻燈片

  • --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的幻燈片

假設您有一個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。

使用https服務器提供幻燈片:--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

Markdown

  • --to markdown

簡單的降價輸出。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.ipynbin 的副本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

Jupyter筆記本一般與已清除的輸出單元一塊兒保存。nbconvert提供了一種方便的方法來執行.ipynb筆記本文件的輸入單元格,並將結果(輸入和輸出單元格)保存爲.ipynb文件。

在本節中,咱們將展現如何執行.ipynb筆記本文檔,以筆記本格式保存結果。若是須要將筆記本導出爲其餘格式,例如reStructured Text或Markdown(可選擇執行它們),請參閱使用nbconvert做爲庫。

執行筆記本很是有用,例如,能夠一步在Python庫中運行全部筆記本,或者做爲在涉及多個筆記本的項目中自動執行數據分析的方法。

從命令行執行筆記本

執行筆記本的相同功能經過命令行界面或Python API接口公開 。例如,能夠從命令行執行筆記本:

jupyter nbconvert --to notebook --execute mynotebook.ipynb
複製代碼

使用Python API接口執行筆記本

本節將說明Python API接口。

示例

讓咱們從一個完整的快速示例開始,給出如下部分的詳細說明。

導入:首先咱們導入nbconvertExecutePreprocessor 類:

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')
複製代碼

咱們指定的兩個(可選的)參數timeoutkernel_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。

執行參數(traitlets)

傳遞給的參數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庫,其中包括文檔/測試筆記本。這些筆記本將在其元數據中指定python2python3內核(取決於上次保存筆記本時使用的內核)。實際上,這些筆記本將適用於Python 2Python 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查看時按預期運行。

若是在執行後沒法查看窗口小部件結果,則可能須要在「 文件」菜單下選擇「 信任筆記本 」

相關文章
相關標籤/搜索