扩展Jupyter生态系统的99种方法

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

每当有人在Jupyter生态系统中说“你可以通过扩展来实现它 ”时,你通常并不清楚他们在谈论的是哪种扩展。Jupyter生态系统是非常模块化和可扩展的,所以有很多方法去扩展它。这篇博客文章的目的是对扩展Jupyter的最常见方法进行一个快速总结,并为你提供一些链接来帮助你探索Jupyter扩展生态系统。


JupyterLab 扩展 (labextension)

 1-gCej3VJVI_8k27KR33wDLw(1).gif

在JupyterLab 中使用jupyterlab-drawio 扩展绘制矢量图形


JupyterLab是一个流行的用于与Jupyter Notebook一起工作的“新”接口。它是一个用于处理notebook、代码和数据的交互式开发环境,因此具有极强的可扩展性。使用JupyterLab扩展,你可以添加全新的功能,或者更改接口行为的几乎任何方面。它们是用TypeScript或JavaScript编写的,并运行在浏览器中。


JupyterLab文档提供了关于如何安装&使用扩展,以及如何编写&分发它们的信息。你还可以通过在GitHubnpmjs.com上进行搜索来发现更多扩展。


我最喜欢的JupyterLab扩展是jupyterlab-vim ——它允许你在JupyterLab中完全使用Vim键绑定!


经典的notebook 扩展(nbextension)

 001.jpg

nbextension目录表


当人们想到“notebook界面”时,他们可能回想起经典的Jupyter Notebook。你可以使用nbextensions来扩展notebook用户体验的任何方面。这些是客户端JavaScript的一小部分,它允许你随意添加/更改功能。它们是经典notebook,相当于JupyterLab扩展。


Jupyter Notebook文档中有关于如何安装或开发扩展的信息。非官方的Jupyter Notebook扩展库有很多流行的扩展和一个GUI扩展管理器,你可以使用它们来安装nbextension。


我最喜欢的nbextension为你的notebook提供了一个可折叠的目录表。


Notebook 服务器扩展 (serverextension)

与JupyterLab或nbextension不同,Jupyter Notebook服务器扩展是用Python编写的,以添加一些服务器端功能。服务器扩展有两个主要用例。

 

001.jpg

LaTeX在JupyterLab中的 预览 


第一个用例是为特定的JupyterLab或经典的notebook扩展提供一个后端。一个例子是jupyterlab-latex JupyterLab扩展,它提供了在JupyterLab中对LaTeX文件的实时预览。它有一个与JupyterLab文本编辑器集成的前端JupyterLab扩展,以及一个后端服务器扩展组件,后者实际运行LaTeX命令来生成显示给你的输出。


001.jpg


第二个用例是提供由任何类型的服务器端处理支持的任何用户界面。服务器扩展可以作为任意的Tornado HTTP处理程序—因此,你可以将任何你能想到的web应用程序编写为一个Jupyter serverextension。nbgitpuller就是一个例子,它提供了以透明的方式将git存储库中的notebook分发给用户的UI的机制。


我最喜欢的是jupyter-rsession-proxy,它允许你在JupyterHub环境中运行RStudio !


Jupyter 内核

你可能对通过Python来使用Jupyter notebook非常熟悉,但是在编写你的notebook时,你可以使用大量的其他语言:R、Julia、JavaScript、Octave、Scala/Spark、交互式C++、bash,甚至Matlab! 这些被称为内核,它们在zeromq上使用语言无关的Jupyter协议。你可以通过直接实现Jupyter协议、使用metakernel项目对Jupyter协议进行包装,或者通过Xeus使用C++绑定,为你的语言编写一个新的内核。一旦一个内核已经存在,它就可以与任何Jupyter前端无缝运行——经典notebook、JupyterLab、nteract、终端jupyter控制台、图形Qt控制台等等。


我最喜欢的内核是  linux 内核.


IPython 魔法

如果你在一个notebook中编写了 %matplotlib inline,那么你就已经使用了一个IPython魔法。这些宏几乎与Python的宏类似——你可以编写自定义代码来解析行(或单元格)的其余部分,并执行你想要的任何操作。


行魔法从一个%符号开始,并根据行的其余部分采取一些操作。例如,%cd somedirectory会更改python进程的当前目录。单元格魔法从%%开始,然后对它之后的整个单元格内容进行操作。%%timeit可能是最著名的——它会对代码运行多次,并对运行时间的统计数据进行报告。


你还可以构建你自己的与IPython集成的魔法命令。例如,ipython-sql包提供了%%sql 魔法命令,用于与数据库无缝运行。但是,请记住,与目前列出的扩展不同,IPython 魔法只适用于IPython内核。


我最喜欢使用的IPython 魔法是Matthias Bussonnier的这篇博客文章,它使用自定义的魔法命令将Python、R、C和Julia无缝地集成在同一个notebook中。


IPython 小部件 (ipywidgets)

001.jpg

使用下拉菜单选择绘图选项,来自Will Koehrsen《尊重数据科学》


IPython 小部件 (ipywidgets)为Jupyternotebook和IPython内核提供了交互式GUI小部件。它们允许你和与你共享你的notebook的人使用GUI元素来探索你的代码中的各种选项,而不必修改代码。加上像voila这样的东西,你可以为创建类似于仪表板的应用程序供其他人使用,而不需要意识到它完全是用一个Jupyter Notebook创建的!


你可以构建自己的自定义小部件来提供特定于域的交互可视化。例如,你可以使用ipyleaflet来交互式地可视化地图,使用itk-jupyter-widget交互式地探索图像分割/配准问题,或者使用pythreejs建模3D对象。


查看vdom项目以获得对相同问题领域的更多响应式看法,查看xwidgets以获得一个C++实现


内容管理器

无论何时当你通过web界面打开或保存一个notebook或文件时,Contents Manager都会决定实际发生什么。默认情况下,它从本地文件系统中加载和保存文件,但是一个自定义内容管理器可以做它想做的任何事情。它的一个流行的用例是从本地文件系统之外的其他地方(比如,Amazon S3 /谷歌云存储、PostgreSQL、HDFS等等)加载/保存内容。当使用其中之一时,你可以通过web界面加载/保存notebook和文件,就像它们在你的本地文件系统上一样!如果你已经使用了其中任何一个来存储数据,那么这将非常有用。


我最喜欢的内容管理器是Jupytext。在保存/加载期间,它会施展一些魔法来为你提供一个与你的.ipynb等价的.py文件,并使它们保持同步。你可以交互式地在你的notebook中查看代码,然后在一个IDE中打开.py文件进行一些繁重的文本编辑,内容管理器会在你再次打notebook时自动将所有更改返回到你的notebook中去。它很神奇。


001.jpg

Jupytext:.ipynb还是.py?为什么不两者同时使用!


扩展 JupyterHub

JupyterHub是一个多用户应用程序,用于生成notebook和其他交互式web应用程序,被设计用于教室、研究实验室和公司。这些组织可能正在使用其他系统,而JupyterHub需要与它们紧密集成。下面简要列出了扩展JupyterHub的一些方法。


Authenticator(身份验证器)

JupyterHub是一个多用户应用程序,因此用户需要以某种方式登录—理想情况下,与登录它们组织中的其他应用程序的方式相同。身份验证器负责此操作。许多流行的身份验证服务已经使用了Authenticator,如LDAP、OAuth(谷歌、GitHub、CILogon、Globus、Okta、Canvas等)、大多数带有LTI的LMS、SAML、JWT、普通用户名和密码、linux用户等等。你可以编写自己的身份验证器或非常容易地定制一个已经存在的,所以无论你的身份验证需要什么—JupyterHub都已经介绍过了。


进程生成程序

使用可插拔的进程生成程序,你可以通过许多不同的方式为每个用户启动一个JupyterNotebook服务器。你可能希望它们生成一个带有docker容器的节点,使用Kubernetes扩展它们,在你的HPC集群上使用它们,让它们运行在你的Hadoop / Spark集群上,使用systemd包含它们,简单地以不同的linux用户或其他许多可能的方式运行它们。进程生成程序本身通常是非常易配置的,当然你也可以编写自己的进程生成程序。


服务

通常,你希望为你的JupyterHub用户提供额外的服务——在空闲时杀死他们的服务器,或者允许他们发布可共享的notebook。你可以运行一个JupyterHub服务来提供这些或类似的服务。用户可以使用他们的JupyterHub身份向这些服务发出请求,服务也可以对JupyterHub进行API调用。这些可以是任意的进程或web服务——例如,BinderHub就被实现为一个JupyterHub服务。


NBConvert 输出器

nbconvert会在notebook格式和各种其他格式之间进行转换——如果你已经使用nbconvert将你的notebook输出到PDF、 LaTeX或HTML,或者你也可以使用nbviewer。它为导出的每一种格式都有一个导出器,你也可以编写自己的导出器来导出到一种新格式——或者只是大量定制一个现有的导出格式。如果你正在执行涉及notebook的复杂转换操作,你可能会发现编写一个导出器是实现你的目标的最简洁的方法。


在对这篇博客文章进行研究时,我最开心的时刻就是发现还存在一个docx导出器。


Bundler 扩展

001.jpg

可发现的方式去启用nbconvert 输出器


Bundler扩展允许你在菜单栏中以项目的形式向Download添加条目。它们通常与nbconvert导出程序一起使用,以使导出程序更易于发现,不过你也可以编写一个自定义的bundler扩展,以便在下载之前对一个notebook进行任何类型的自定义处理。例如,nbreport提供了一个bundler扩展,它以一个合适的方式来清理notebook以便将它视为一个报告,并将它输出为 HTML。


Repo2Docker

repo2docker将git(和其他)存储库转换成可复制的、以数据科学为重点的docker镜像。mybinder.org(以及其他binderhub安装包)依赖它从git存储库构建和启动交互式Jupyter/RStudio会话。目前有两种方法可以扩展repo2docker。


BuildPacks

repo2docker会查看存储库的内容来决定如何构建它。例如,如果有一个requirements.txt,它将设置一个miniconda环境来安装python包,而如果有一个install.R文件的话,它会确保R/Rstudio已经安装。编写一个新的BuildPack允许你扩展此行为,以添加对你喜爱的语言的支持,或者自定义一个现有语言的构建方式。


ContentProviders(内容提供者)

repo2docker的repo部分是一个误称——你可以将任何东西转换成一个docker镜像。目前,它支持git、local folder和zenodo存储库——但是你可以通过创建一个新的ContentProvider来添加对你最喜爱的可重复代码源的支持!


就这些吗?

当然不是?Jupyter生态系统是巨大的,没有一个博客文章可以涵盖所有。这篇博客文章已经遗漏了一些

——企业网关,TLJH插件,等等。随着时间的推移,将会有更新的组件和更新的方法来扩展我们甚至还没有想象到的东西。请在评论区告诉我这里还遗漏了什么。


期待看到你们所有人都创建了漂亮的扩展!

英文原文:https://qiniumedia.freelycode.com/vcdn/1/%E4%BC%98%E8%B4%A8%E6%96%87%E7%AB%A0%E9%95%BF%E5%9B%BE3/99-ways-to-extend-jupyter.pdf
译者:一瞬