摘要:第一個是一個爲 JupyterLab 或經典的 Jupyter 筆記本提供的後端擴展——jupyterlab-latex。和前兩種擴展不同,Jupyter 筆記本的服務器擴展使用 Python 語言編寫,並加入了很多服務端的功能,以下有兩個主要的例子。

文 | yuvipanda 

譯 | 機器之心(一鳴、思源)

推薦 | 編程派公衆號(ID:codingpy)

當有人說:「你可以用 Jupyter 擴展解決這個問題」,他們可能沒有說清楚是什麼樣的擴展。Jupyter 生態系統是非常模塊化且具有擴展性的,所以有很多種擴展方式。這個博客希望能總結最常用的 Jupyter 擴展,並幫助你發掘生態系統中的新功能。

JupyterLab 擴展

在 JupyterLab 中用 jupyterlab-drawio 擴展繪圖

JupyterLab 是廣受歡迎的 Jupyter Notebook「新」界面。它是一個交互式的開發環境,可用於筆記本、代碼或數據,因此它的擴展性非常強。使用相關的擴展,可以添加一整套新功能,或者完全改變界面的運行方式。這些擴展是基於 TypeScript 火 JavaScript 寫的,它們在瀏覽器裏運行。

經典的 Jupyter Notebook 擴展

Jupyter Notebook 中的內容列表擴展

人們總是會想到經典的 Jupyter 筆記本界面,但實際上,你可擴展它的各個模塊。這些 JavaScript 客戶端可以讓你按照自己的想法添加或改變功能,它們和 JupyterLab 擴展是一樣的。

筆記本服務器擴展(serverextention)

和前兩種擴展不同,Jupyter 筆記本的服務器擴展使用 Python 語言編寫,並加入了很多服務端的功能,以下有兩個主要的例子。

在 JupyterLab 中預覽 LaTeX 內容

預覽 LaTeX

第一個是一個爲 JupyterLab 或經典的 Jupyter 筆記本提供的後端擴展——jupyterlab-latex。它可以在 JupyterLab 中預覽 LaTeX 文件。它有一個和 JupyterLab 文本編輯器集成的擴展,以及一個後端服務器擴展,可以運行 LaTeX 命令,並在前端顯示效果。

集成網絡應用

第二個則是爲提供服務端處理提供用戶界面的擴展。因爲服務網擴展可以作爲任意 TornadoHTTP handler,因此任何你想得到的網絡應用都可以寫成一個 Jupyter 服務擴展。這裏的例子是 npgipuller,提供了用戶界面,可以將 git 代碼倉庫發佈給用戶。

Jupyter 內核

你可能已經很熟悉在 Jupyter 筆記本中使用 Python 語言了,其實你可以在其中運行很多語言:R、Julia、JavaScript、Octave、Scala/Spark、C++、bash,甚至是 Matlab。這些都被稱作內核。你可以爲自己常用的編程語言寫一個內核,將 Jupyter 協議直接用在上面,用 metakernel 項目打包,或者用 Xeus 打包成 C++依賴。內核製作好以後,它可以在任何一個 Jupyter 前端運行,包括經典筆記本、JupyterLab、 nteract、Jupyter 命令行等。

IPython Magics

如果你在筆記本里寫過如%matplotlib inline 這樣的命令,那麼你已經嘗試過 IPython 功能了。這些命令就像是 Python 中的宏(macro)——你可以寫定製化的代碼,將剩餘的代碼塊獨立出來,然後做自己想做的事情。

這種魔術函數從% 開始,然後通過% 後面的代碼發揮功能。例如%cd somedirectory 可以切換 Python 運行中的文件目錄。代碼塊功能從%% 開始,並運行後面的整個塊。%%timeit 應該是最著名的,它可以提供運行代碼塊的時間。

你也可以構建自己的魔術函數。例如,ipython-sql (https://github.com/catherinedevlin/ipython-sql) 包提供%%sql 命令,可以和 sql 數據庫無縫工作。然而,和之前列出的擴展不同,IPython 的命令只能在有 IPython 內核的環境工作。

IPython 小工具

用 drop down 玩轉繪圖功能。

IPython 小工具爲 Jupyter 筆記本和 IPython 內核提供了 GUI 工具。這些工具可以讓你在共享筆記本時,使用 GUI 調試,而非使用代碼。如果和其他工具,如 voila 聯用,你可以製作一個類似儀表盤一樣的應用,其他人可以直接使用,甚至都不知道這是一個 Jupyter 筆記本。

你可以自己定製一些工具,爲其他人提供領域內的動態可視化。例如,你可以用 ipyleaflet 製作動態地圖,用 itk-jupyter-widget 動態地研究圖像分割/配準任務,或者用 pythreejs 建模 3D 目標。

內容管理器

內容管理器決定了你讀寫文件時的操作。默認情況下,管理器從本地文件系統中讀寫文件,但是一個定製化的管理器可以從其它地方讀寫文件,如 Amazon S3 / Google Cloud Storage、PostgreSQL、HDFS 等。你可以通過 web 界面讀寫它們,就好像文件在本地一樣。

我最喜歡的內容管理器是 Jupytext。在你讀寫.ipynb 的文件時,它會將其轉換爲.py 文件,並保持文件同步。在你 IDE 中對一個.py 文件進行了很多編輯後,可以自動在筆記本中看到這些更新,這是很神奇的事情。

Jupytext: .ipynb 或者 .py? 我全都要

擴展 JupyterHub

JupyterHub 是多用戶應用,可以使用於教學、實驗室或者生產中。這些組織很可能有其它系統,所以 Jupyter 需要和這些系統集成到一起。以下是一些擴展 JupyterHub 的簡單方法。

認證器

JupyterHub 是一個多用戶應用,所以用戶需要登錄,認證器的工作是對登錄用戶進行身份驗證。現在已經有許多流行的驗證器了,如 LDAP、OAuth(Google、GitHub、CILogon、Globus、Okta、Canvas 等)。你可以寫一個自己需要的認證器,因此 JupyterHub 可以覆蓋各種使用場景。

生成器(Spawner)

如果使用一個可插拔的生成器,你可以用很多方法給每個用戶提供 Jupyter 筆記本服務器。你可能讓他們從一個節點生成 Docker 容器、將它們連接到 Kubernetes 上、讓它們使用你的 HPC 集羣、或者使用你的 Hadoop 或者 Spark 集羣、用 systemd 提供服務、或者直接將這些服務器視爲不同的 Linux 用戶。這些生成器一般都很容易定製參數,當然你也可以自己寫一個。

服務

你有時希望給 JupyterHub 用戶提供額外服務——在閒置時回收資源,或者讓他們發佈筆記本。你可以運行一個 JupyterHub Service 來提供這些服務。用戶可以發起請求,而服務也可以向 JupyterHub 發起 API 請求。這些可以是直接的請求,或者網絡服務。例如,BinderHub (https://github.com/jupyterhub/binderhub) 是 JupyterHub 服務中的一種。

NBConvert Exporter

Nbconvert 擴展可以令筆記本格式的文件和其他格式相互轉換。如果你導出筆記本到 PDF、LaTeX、HTML 或者 nbviwer 的話,你已經使用了這個擴展。在這個擴展裏,對應每一個格式都有一個導出器,你也可以寫一個針對自己格式的導出器,或者可以利用已有的定製一個。

在寫這篇博客時,我最開心的時刻是發現有 docx 文檔(word)導出器。

word 導出器:https://github.com/m-rossi/jupyter-docx-bundler

Bundler 擴展

很容易就能找到 nbconvert 導出器的方法

Bundler 擴展使你可以在菜單欄添加「下載爲」按鈕。這個按鈕和 nbconvert 導出器聯用,使得導出器更容易被找到,儘管你可以寫一個定製化的擴展,使筆記本在下載前進行任何操作。例如,nbreport 擴展提供一個 bundler 擴展,可以將筆記本格式導出爲 HTML。

Repo2Docker

Repo2Docker 擴展將 git 或者其他倉庫轉換爲可重新使用、適合於數據科學的 docker 鏡像。網站 mybinder.org(和其他 binderhub 安裝包)使用這個擴展構建和運行 Jupyter/RStudio 進程。如下所示,現在有兩種擴展 repo2docker 的方式。

BuildPacks

Repo2docker 會查看代碼庫中的內容,並決定如何去構建它。例如,如果裏面有 requirements.txt 文件,它會設置一個小型 conda 環境,並把 Python 包安裝進去。如果裏面有 install.R 文件,擴展則會保證 R/RStudio 已經安裝。寫一個 BuildPack (https://repo2docker.readthedocs.io/en/latest/architecture.html#buildpacks) 使你可以將這個功能擴展到你喜歡的編程語言中。

ContentProviders

Repo2docker 中的 repo 部分有點用詞不當——實際上你可以將任何程序打包進一個 Docker 鏡像中。現在,它支持 git 本地文件夾和 zenodo (https://zenodo.org/) 代碼倉庫,但是你可以爲自己喜歡的代碼源添加支持,並製作一個新的 ContentProvider。

只有這些了嗎?

當然不是!Jupyter 生態是一個很大的系統,一篇博客無法完全覆蓋所有內容。這個博客已經少了一些,如 enterprise gateway 和 TLJH Plugins。Jupyter 的生態是活躍多變的,很快還有更多好用的擴展出現。

原文鏈接:

https://blog.jupyter.org/99-ways-to-extend-the-jupyter-ecosystem-11e5dab7c54

相關文章