架構#

此頁面包含有關 Jupyter 生態系統核心部分不同架構設計的資訊。其中一些是獨立專案,另一些則展示了專案之間的關係。

專案概覽#

下面是專案關係的高階視覺化概覽。它截至 2022 年是最新資訊。

Architecture diagram of Jupyter project relationships from servers, applications, API, and kernels.

IPython 核心#

本節重點介紹 IPython 和核心。當我們討論 IPython 時,我們談論兩個基本角色:

  • 作為熟悉的 REPL 的終端 IPython

  • IPython 核心,IPykernel,它提供計算並與前端介面(如 notebook)進行通訊

終端 IPython#

當您鍵入 ipython 時,您會獲得原始的 IPython 介面,在終端中執行。它做類似這樣的事情:

while True:
    code = input(">>> ")
    exec(code)

當然,它要複雜得多,因為它必須處理多行程式碼、使用 readline 的 tab 補全、魔術命令等等。但其模型類似於程式碼示例:提示使用者輸入一些程式碼,當他們輸入完成後,在同一程序中執行它。這種模型通常被稱為 REPL,即讀取-求值-列印-迴圈。

IPython 核心#

所有其他介面——Notebook、Qt 控制檯、終端中的 ipython console 以及第三方介面——都使用 IPython 核心。IPykernel 是一個獨立的程序,負責執行使用者程式碼以及計算可能的補全等任務。前端(如 notebook 或 Qt 控制檯)使用透過 ZeroMQ 套接字傳送的 JSON 訊息與 IPython 核心通訊;前端與 IPython 核心之間使用的協議在Jupyter 訊息傳遞中描述。

核心的核心執行機制與終端 IPython 共享。

一個核心程序可以同時連線到多個前端。在這種情況下,不同的前端將可以訪問相同的變數。

這種設計旨在允許在相同核心上輕鬆開發不同的前端,但它也使得透過用這些語言開發核心來支援相同前端中的新語言成為可能,我們正在改進 IPython 以使其更加實用。

如今,開發其他語言核心有三種方式:

  • 包裝器核心重用 IPykernel 的通訊機制,並僅實現核心執行部分。

  • 原生核心在目標語言中實現執行和通訊。

  • 基於 xeus 的核心,xeus 是協議的原生實現,它實現了核心的語言特定部分。與包裝器方法相反,xeus 不依賴於 Python 執行時。

對於具有良好 Python 包裝器的語言,如 octave_kernel,或者難以實現通訊機制的語言,如 bash_kernel,包裝器核心更容易快速編寫。原生核心可能由使用它們的社群更好地維護,如 IJuliaIHaskell。當語言直譯器提供 C++ 或 C API 時,xeus 核心很容易編寫。

Jupyter Notebook 格式#

Jupyter Notebook 是結構化資料,表示您的程式碼、元資料、內容和輸出。儲存到磁碟時,notebook 使用副檔名 .ipynb,並使用 JSON 結構。有關 notebook 格式結構和規範的更多資訊,請參閱nbformat 文件

Jupyter Notebook 介面#

Jupyter Notebook 及其靈活的介面將 notebook 擴充套件到程式碼之外,包括視覺化、多媒體、協作等。除了執行您的程式碼外,它還將程式碼和輸出以及 Markdown 筆記儲存在一個可編輯的文件中,稱為 notebook。當您儲存它時,它會從您的瀏覽器傳送到 Jupyter 伺服器,Jupyter 伺服器將其作為帶有 .ipynb 副檔名的 JSON 檔案儲存到磁碟。

Jupyter 伺服器是一個通訊中心。瀏覽器、磁碟上的 notebook 檔案和核心不能直接相互通訊。它們透過 Jupyter 伺服器進行通訊。Jupyter 伺服器(而不是核心)負責儲存和載入 notebook,因此即使您沒有該語言的核心,您也可以編輯 notebook——您只是無法執行程式碼。核心對 notebook 文件一無所知:它只在使用者執行程式碼時接收要執行的程式碼單元。

將 Jupyter Notebook 匯出為其他格式#

Jupyter 中的 Nbconvert 工具將 notebook 檔案轉換為其他格式,例如 HTML、LaTeX 或 reStructuredText。此轉換透過一系列步驟進行:

  1. 預處理器修改記憶體中的 notebook。例如,ExecutePreprocessor 執行 notebook 中的程式碼並更新輸出。

  2. 匯出器將 notebook 轉換為另一種檔案格式。大多數匯出器都使用模板來完成此操作。

  3. 後處理器處理匯出生成的檔案。

nbviewer 網站使用 nbconvert 和 HTML 匯出器。當您給它一個 URL 時,它會從該 URL 獲取 notebook,將其轉換為 HTML,然後將該 HTML 提供給您。

IPython.parallel#

IPython 還包括一個平行計算框架 IPython.parallel。這允許您控制許多獨立的引擎,它們是上面描述的 IPython 核心的擴充套件版本。

JupyterHub 和 Binder#

JupyterHub 是一個多使用者中心,它生成、管理和代理多個單使用者 Jupyter notebook 伺服器例項。這可用於提供各種介面和環境,並且可以在多種基礎設施上執行。Kubernetes 上的 JupyterHub 是一個用於在 Kubernetes 基礎設施上執行 JupyterHub 的 Helm Chart,而 BinderHub 是一個定製的 JupyterHub 部署,用於可共享、可重現的互動式計算環境。

下面的連結描述了 JupyterHub 和 JupyterHub 的幾種發行版的架構。

JupyterLab#

JupyterLab 是一個靈活、可擴充套件的互動式計算介面。以下是一些有助於理解 JupyterLab 架構的有用連結。