js設(shè)置html5禁止橫屏(js怎么阻止頁(yè)面跳轉(zhuǎn))
作者:京東科技隱私計(jì)算產(chǎn)品部 孫曉軍
1. Jupyter Notebook介紹
圖1 Jupter項(xiàng)目整體架構(gòu)
[https://docs.jupyter.org/en/latest/projects/architecture/content-architecture.html]
Jupyter Notebook是一套基于web的交互式開(kāi)發(fā)環(huán)境。用戶可以在線開(kāi)發(fā)和分享包含代碼和輸出的交互式文檔,支持實(shí)時(shí)代碼,數(shù)學(xué)方程,可視化和 markdown等。用途包括:數(shù)據(jù)清理和轉(zhuǎn)換,數(shù)值模擬,統(tǒng)計(jì)建模,機(jī)器學(xué)習(xí)等等。
Jupyter Notebook內(nèi)部通過(guò)內(nèi)核維護(hù)狀態(tài)并運(yùn)行代碼片段,瀏覽器顯示代碼片段和其執(zhí)行的結(jié)果。Jupyter Notebook提供了一個(gè)用戶交互式的開(kāi)發(fā)環(huán)境,用戶可以通過(guò)執(zhí)行一部分代碼片段,并觀察執(zhí)行結(jié)果。這種交互式設(shè)計(jì),使得Jupyter Notebook非常適合數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)的開(kāi)發(fā)工作。
注意本文的代碼和腳本,均基于Jupyter Notebook v6.5.2穩(wěn)定版本。
2. Jupyter的工作方式
展開(kāi)全文
圖2 Jupter Notebook工作方式
[https://docs.jupyter.org/en/latest/projects/architecture/content-architecture.html]
Jupyter的主要工作單元是Jupyter Server和Kernel。其中Jupyter Server用來(lái)提供基于Web的界面和API服務(wù),Kernel用來(lái)執(zhí)行代碼片段。瀏覽器通過(guò)Http和Websockets的方式和Jupyter Server進(jìn)行交互,Jupyter Server和kernel之間,通過(guò)ZeroMQ進(jìn)行數(shù)據(jù)通信。
Jupyter Server采用經(jīng)典的MVC模式,使用了tornado作為web服務(wù)器,用來(lái)提供地址映射和控制器邏輯,使用jinja2來(lái)提供模板視圖功能。
Jupyter Notebook(v6.5.2)項(xiàng)目的主要模塊結(jié)構(gòu)如下:
模塊說(shuō)明notebookNotebook功能模塊。terminal終端模塊。為Jupyter提供控制臺(tái)交互能力。view文件可視化模塊。比如pdf文件的顯示。tree工作區(qū)目錄樹(shù)nbconvert格式轉(zhuǎn)換模塊,可以把Jupyter Notebook轉(zhuǎn)換成html,pdf等格式kernelJupyter Notebook 內(nèi)核servicesJupyter Notebook REST API模塊i18nJupyter Notebook多語(yǔ)言資源3. 安裝Jupyter Notebook
前置條件
Python和pip
不同的Jupyter Notebook對(duì)Python有不同的版本要求。我們安裝的最新的穩(wěn)定版本v6.5.2的Jupyter Notebook,要求Python的最低版本為3.6。注意這個(gè)Python的版本,不同于內(nèi)核的Python版本。對(duì)于Jupyter內(nèi)核來(lái)說(shuō),支持的Python版本和Jupyter Notebook依賴(lài)的Python版本沒(méi)有關(guān)系。
在Linux系統(tǒng)下安裝Jupyter Notebook
使用pip安裝Jupyter notebook非常簡(jiǎn)單。如果服務(wù)器同時(shí)擁有Python2和Python3的pip,注意需要使用pip3來(lái)替換命令中的pip。
# 更新pip
pip install --upgrade pip
# 安裝jupyter
pip install jupyter
# 檢查安裝的jupyter
jupyter --version
//輸出 notebook : 6.5.2
4. 配置和啟動(dòng)Jupyter
Jupyter提供了大量的啟動(dòng)參數(shù),用來(lái)配置Jupyter Server。我們可以在啟動(dòng)Jupyter服務(wù)時(shí),通過(guò)命令行參數(shù)的方式配置當(dāng)前啟動(dòng)的服務(wù),但更普遍的方式是使用Jupyter的配置文件。
# 生成配置文件
jupyter notebook --generate-config
// 默認(rèn)生成的配置文件位置:
/root/.jupyter/jupyter_notebook_config.py
# 修改Jupyter配置文件...
# 啟動(dòng)jupyter
jupyter notebook
Jupyter直接使用一個(gè)Python文件來(lái)配置Jupyter服務(wù),所有的配置項(xiàng)均通過(guò)Python代碼來(lái)完成。常用的配置項(xiàng)及其說(shuō)明如下:
名稱(chēng)默認(rèn)值說(shuō)明c.NotebookApp.allow_rootFalse為了安全,Jupyter默認(rèn)不允許使用root用戶啟動(dòng)。如果需要以root用戶的身份啟動(dòng)Jupyter,需要開(kāi)啟此設(shè)定c.NotebookApp.allow_origin''當(dāng)需要Jupyter內(nèi)嵌到iframe時(shí),可以設(shè)置為“*“來(lái)避免跨origin的限制c.NotebookApp.iplocalhost當(dāng)需要通過(guò)外網(wǎng)地址來(lái)訪問(wèn)Jupyter服務(wù)時(shí),需要設(shè)置一個(gè)有效的服務(wù)器IP地址。c.NotebookApp.port8888Jupyter server對(duì)外服務(wù)端口c.NotebookApp.notebook_dir/Jupyter的工作空間,默認(rèn)可以訪問(wèn)服務(wù)器上當(dāng)前用戶的所有文件系統(tǒng)c.NotebookApp.open_browserTrue啟動(dòng)服務(wù)后是否立即通過(guò)瀏覽器打開(kāi)服務(wù)地址c.NotebookApp.default_url/treeJupyter服務(wù)的默認(rèn)地址c.NotebookApp.extra_static_paths[]擴(kuò)展靜態(tài)文件目錄c.NotebookApp.extra_template_paths[]擴(kuò)展模板文件目錄c.KernelSpecManager.allowed_kernelspecsset()默認(rèn)允許使用所有的kernelc.NotebookApp.nbserver_extensions{}允許加載的Jupyter Server擴(kuò)展5. 使用Jupyter
5.1. 創(chuàng)建Notebook
啟動(dòng)Jupyter 后,在瀏覽器內(nèi)輸入 http://服務(wù)器地址:端口/,Jupyter會(huì)默認(rèn)重定向到.default_url指定的工作區(qū)目錄樹(shù)地址,默認(rèn)是工作區(qū)目錄樹(shù)的界面。
如果在訪問(wèn)的過(guò)程中,使用了默認(rèn)的token作為其認(rèn)證方式,那么在首次打開(kāi)時(shí),需要輸入Jupyter Notebook的token值,這個(gè)值可以在啟動(dòng)Jupyter時(shí)的控制臺(tái)輸出中找到,或者使用Jupyter命令來(lái)查詢
# 查詢運(yùn)行的jupyter notebook
jupyter notebook list
//返回結(jié)果中包含了http://x.x.x.x:8899?token=ABC 的信息,其中的ABC就是我們需要的token
圖3 Jupter Notebook的默認(rèn)工作區(qū)目錄樹(shù)頁(yè)面
Jupyter Notebook通過(guò)Jupyter Server提供基于Web的平臺(tái)無(wú)關(guān)的工作方式,這使得跨平臺(tái)開(kāi)發(fā)和協(xié)作,代碼分享等能力變得比傳統(tǒng)IDE更加容易。
在Jupyter 工作區(qū)管理界面,用戶可以靈活地以類(lèi)似文件系統(tǒng)的方式管理工作區(qū)的數(shù)據(jù)??梢詣?chuàng)建文件和文件夾,編輯文件和文件夾,可以上傳和下載文件。通過(guò)選擇一個(gè)Jupyter內(nèi)核,可以創(chuàng)建一個(gè)Notebook文件。
圖4 通過(guò)Jupyter內(nèi)核創(chuàng)建一個(gè)Notebook
5.2. 使用Notebook
使用Python3內(nèi)核創(chuàng)建一個(gè)Notebook后,我們得到一個(gè)xxx.ipynb(IPython Notebook)文件。這個(gè)文件是一個(gè)json格式的文本文件,其中包含了我們?cè)贜otebook中編寫(xiě)的代碼和文本內(nèi)容,也包含了界面上沒(méi)有顯示的元數(shù)據(jù)信息。通過(guò)在工作區(qū)目錄界面選擇一個(gè)notebook文件,點(diǎn)擊編輯,我們可以查看到ipynb文件的原始內(nèi)容。
圖5 ipynb文件的原始內(nèi)容
我們可以像使用其它IDE類(lèi)似的方式來(lái)使用Notebook,在使用Notebook上,我們主要關(guān)注下Jupyter內(nèi)核和單元格。
內(nèi)核是執(zhí)行單元格代碼的核心進(jìn)程,不同的內(nèi)核,決定了我們?cè)趩卧裰心軌蚓帉?xiě)哪些語(yǔ)言的代碼,以及對(duì)應(yīng)了指定的編程語(yǔ)言的哪個(gè)版本等信息。
單元格是整個(gè)Notebook的核心組成部分,我們編寫(xiě)的代碼和文本,通過(guò)一些列Notebook單元格來(lái)組成。Notebook提供了Code,Markdown, Raw NBConvert, Heading四種類(lèi)型的單元格。
?Code單元格。用來(lái)編寫(xiě)內(nèi)核指定語(yǔ)言的程序代碼
?Markdown單元格。使用Markdown編輯器的語(yǔ)法來(lái)編輯富文本
?Raw NBConvert單元格。原始的文本,不會(huì)被當(dāng)作代碼或markdown被解釋執(zhí)行
?Heading單元格。Heading是Mardown的一個(gè)子集,對(duì)應(yīng)了Markdown中的標(biāo)題編寫(xiě)語(yǔ)法
Jupyter Notebook使用了機(jī)器學(xué)習(xí)中檢查點(diǎn)的概念,在我們修改Notebook的過(guò)程中,Jupyter會(huì)自動(dòng)保存我們的修改,我們也可以通過(guò)【文件】-【保存】來(lái)手動(dòng)保存檢查點(diǎn)。檢查點(diǎn)文件包含了我們編寫(xiě)的Notebook內(nèi)容,以及執(zhí)行代碼單元格之后的輸出。我們可以在工作空間的“.ipynb_checkpoints”文件夾下,找到這些檢查點(diǎn)文件。
圖6 使用Jupyter單元格來(lái)編寫(xiě)交互式代碼
5.3. 分享Notebook
相較于使用傳統(tǒng)的IDE編寫(xiě)的代碼,基于Web服務(wù)的Jupyter Notebook在代碼分享上擁有著天然的優(yōu)勢(shì)。
在Jupyter Notebook中,我們可以通過(guò)兩種不同的方式分享我們創(chuàng)作的nootbook。
傳統(tǒng)的技術(shù)文檔或者說(shuō)明書(shū),通過(guò)靜態(tài)的文本,配合圖片和視頻,來(lái)描述和講解特定的技術(shù)或功能。有了Jupyter Notebook后,我們?nèi)匀豢梢允褂肗otebook來(lái)編寫(xiě)類(lèi)似傳統(tǒng)的技術(shù)文檔。在此基礎(chǔ)上,我們可以加入更生動(dòng)的代碼交互單元格,用戶通過(guò)查看文檔說(shuō)明,并與文檔中提供的代碼進(jìn)行互動(dòng),可以更生動(dòng)地介紹產(chǎn)品中的功能和技術(shù)。每個(gè)Jupyter Notebook的ipynb文件,都對(duì)應(yīng)了一個(gè)獨(dú)立的訪問(wèn)地址: http://x.x.x.x:8899/notebooks/my_notebook.ipynb ,通過(guò)分享此文件的地址,其他用戶可以方便地使用包含了富文本和可執(zhí)行的代碼的交互式Notebook文檔。
我們通過(guò)逐步執(zhí)行文檔中的所有單元格,得到一個(gè)包含了我們編寫(xiě)的說(shuō)明和代碼,以及代碼執(zhí)行的輸出結(jié)果的完整文檔。之后點(diǎn)擊【文件】- 【另存為】,選擇一種合適的文件格式。我們可以把文檔導(dǎo)出為一份靜態(tài)文件,通過(guò)共享此靜態(tài)文件,我們實(shí)現(xiàn)了Notebook文檔的離線分享。
5.4. 魔法函數(shù)
Jupyter Notebook提供了一些列魔法函數(shù)來(lái)增強(qiáng)Jupyter Code單元格的功能,通過(guò)魔法函數(shù),我們能夠執(zhí)行javascript腳本,html代碼,運(yùn)行另一個(gè)可執(zhí)行程序等許多額外的功能。
我們可以在Jupyter代碼單元格中使用 %lsmagic命令來(lái)查看所有的魔法函數(shù),如果要閱讀詳細(xì)的魔法函數(shù)的使用說(shuō)明,可以參考: https://ipython.readthedocs.io/en/stable/interactive/magics.html
魔法函數(shù)分為行魔法函數(shù),單元格魔法函數(shù)和會(huì)話魔法函數(shù)。顧名思義,行魔法函數(shù)只對(duì)當(dāng)前行起作用,而單元格魔法函數(shù)則作用于整個(gè)單元格,會(huì)話魔法函數(shù)則作用于整個(gè)會(huì)話期間。
一些常用的魔法函數(shù):
指令說(shuō)明%matplotlib設(shè)置matplot繪圖的顯示模式%%javascript單元格內(nèi)的代碼被識(shí)別為javascript代碼%%html單元格內(nèi)的代碼被識(shí)別為html代碼%run執(zhí)行外部腳本文件%pwd獲取當(dāng)前工作的目錄位置(非工作空間目錄位置)%writefile以文件形式保存當(dāng)前單元格代碼%timeit獲取本行代碼的執(zhí)行時(shí)間%debug激活調(diào)試模式6. 管理Jupyter
6.1. 多語(yǔ)言
Jupyter Notebook使用i18n目錄下的資源來(lái)進(jìn)行多語(yǔ)言翻譯。在Jupyter Notebook啟動(dòng)時(shí),會(huì)加載i18n目錄下的多語(yǔ)言資源。之后根據(jù)http請(qǐng)求指定的語(yǔ)言,為響應(yīng)數(shù)據(jù)提供對(duì)應(yīng)的多語(yǔ)言翻譯。如果沒(méi)有對(duì)應(yīng)的翻譯,則保留原始的多語(yǔ)言標(biāo)簽值(英文)。如果調(diào)整了多語(yǔ)言翻譯,需要重新啟動(dòng)Jupyter Notebook才能使用新的語(yǔ)言包。
Jupyter Notebook的翻譯資源主要分布在三個(gè)po文件中:
?nbjs.po - js文件中的多語(yǔ)言數(shù)據(jù)
?nbui.po - UI界面中的多語(yǔ)言數(shù)據(jù)
?notebook.po - notebook中的多語(yǔ)言數(shù)據(jù)
原始的po文件,需要通過(guò)pybabel工具,把po文件編譯成mo文件,之后部署在notebook/i18n/{LANG}/LC_MESSAGES/目錄下($notebook是notebook的安裝目錄),才能在Jupyter Notebook中作為多語(yǔ)言的資源包來(lái)使用。
# 使用pybabel編譯多語(yǔ)言po文件
pybabel compile -D notebook -f -l ${LANG} -i ${LANG}/LC_MESSAGES/notebook.po -o ${LANG}/LC_MESSAGES/notebook.mo
pybabel compile -D nbui -f -l ${LANG} -i ${LANG}/LC_MESSAGES/nbui.po -o ${LANG}/LC_MESSAGES/nbui.mo
pybabel compile -D nbjs -f -l ${LANG} -i ${LANG}/LC_MESSAGES/nbjs.po -o ${LANG}/LC_MESSAGES/nbjs.mo
圖7 使用了中文語(yǔ)言包后的中文Notebook界面
6.2. 內(nèi)核管理
內(nèi)核(kernel)是獨(dú)立于jupyter服務(wù)和界面之外的用來(lái)運(yùn)行Jupyter代碼單元格的進(jìn)程,Jupyter默認(rèn)提供了ipykernel內(nèi)核來(lái)支持Python開(kāi)發(fā)語(yǔ)言。Jupyter社區(qū)提供了jupyterC, IJava,xeus-cling, xeus-sql等眾多其它編程語(yǔ)言的內(nèi)核,用來(lái)支持C/C++, Java, SQL等編程語(yǔ)言。
ipykernel默認(rèn)使用系統(tǒng)環(huán)境下的Python來(lái)提供服務(wù)。我們可以使用ipykernel安裝多個(gè)Python kernel來(lái)提供Python2.x, Python3.x等多個(gè)Python內(nèi)核環(huán)境。
安裝kernel后,kernel的信息被保存在kernel.json文件中,我們可以在 /usr/local/share/jupyter/kernels 目錄,找到Jupyter安裝的所有kernel以及對(duì)應(yīng)的kernel.json文件。
kernel可以直接繼承自安裝kernel的Python指令,也可以使用Python虛擬環(huán)境。
# 1.直接繼承自Python指令的kernel安裝
# 安裝ipykernel
pip install ipykernel
# 安裝kernel
python -m ipykernel install --name tensorflow2 --display-name "tensorflow2"
# 2. 在Python虛擬環(huán)境下的kernel安裝
# 激活虛擬環(huán)境
source activate myenv
# 安裝ipykernel
pip install ipykernel
# 安裝kernel
python -m ipykernel install --name myenv --display-name "Python3 (myenv)"
如果需要查看當(dāng)前的kernel列表,以及刪除已經(jīng)安裝的kernel,可以使用如下的Jupyter命令:
# 查看已經(jīng)安裝的kernel列表
jupyter kernelspec list
# 刪除列表中指定的kernel
jupyter kernelspec remove kernelname
6.3. REST API
Jupyter提供了REST API接口來(lái)和Jupyter server進(jìn)行交互。借助REST API的能力,我們可以以編程的方式和Jupyter Server進(jìn)行交互,靈活地管理Jupyter Server。另外REST API為現(xiàn)代化的軟件開(kāi)發(fā)提供了一個(gè)優(yōu)秀的能力:自動(dòng)化。
借助Jupyter Notebook REST API,可以實(shí)現(xiàn)文件的上傳和下載,檢查點(diǎn)管理,會(huì)話管理,內(nèi)核管理,終端管理等一些列管理能力。完整的Jupyter REST API接口列表可以參考: https://jupyter-server.readthedocs.io/en/latest/developers/rest-api.html
要使用REST API,需要在請(qǐng)求中攜帶認(rèn)證信息。Jupyter支持直接把token作為query string的方式來(lái)認(rèn)證,也可以使用標(biāo)準(zhǔn)的Http Authorization頭信息來(lái)完成認(rèn)證。使用Authorization頭來(lái)認(rèn)證的格式如下:
Authrozation: token 527a9f1430ccfed995ebcf15517583a2547c2469bc3c47a6
圖8 使用Postman來(lái)調(diào)用Jupyter REST API接口
6.4. 安全管理與多人協(xié)作
Jupyter提供了靈活強(qiáng)大的能力,用以支持在線的交互式文檔和代碼的編寫(xiě)。但Jupyter項(xiàng)目自身沒(méi)有提供精細(xì)化的安全管理體系,用以支持多用戶下靈活地使用Jupyter Notebook的功能。對(duì)于文件安全,Jupyter依賴(lài)于啟動(dòng)服務(wù)的linux用戶,合理地配置啟動(dòng)Jupyter的用戶的權(quán)限,才能保證使用Jupyter的用戶,不會(huì)對(duì)系統(tǒng)或項(xiàng)目造成破壞。Jupyter工作空間的設(shè)定,僅起到了方便Jupyter使用者管理必要文件的易用性,不能阻擋用戶訪問(wèn)和管理工作空間外的文件系統(tǒng)。另外,配合使用Python虛擬環(huán)境,可以防止Jupyter Notebook提供的 pip install ,pip uninstall功能,對(duì)現(xiàn)有項(xiàng)目環(huán)境造成破壞。
在多人協(xié)作方面,JupyterHub項(xiàng)目提供了多人協(xié)作Jupyter Notebook和Jupyter lab開(kāi)發(fā)的能力。使用JupyterHub,不同職能的用戶可以在自己獨(dú)立的空間內(nèi)進(jìn)行Notebook的編寫(xiě)工作,不同用戶間也可以方便地分享各自的Notebook。
7. 擴(kuò)展Jupyter
7.1. 前端擴(kuò)展
Jupyter Notebook前端擴(kuò)展(front end extension)是使用Javascript語(yǔ)言編寫(xiě)的異步模塊,可以用來(lái)繪制Jupyter界面的儀表盤(pán),Notebook,工具欄等,。定義一個(gè)前端擴(kuò)展必須要實(shí)現(xiàn)一個(gè)load_ipython_extension方法,當(dāng)前端控件被加載時(shí),Jupyter client會(huì)調(diào)用load_ipython_extension方法。
Jupyter Notebook前端擴(kuò)展能力目前還不是一個(gè)穩(wěn)定的版本,不保證代碼能夠向后兼容。Jupyter的JS API目前也沒(méi)有官方的文檔,需要通過(guò)源代碼或者實(shí)際加載的JS來(lái)查看Jupyter前端腳本的成員和方法。
我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的前端擴(kuò)展腳本,在jupyter前端的工具條中,添加一個(gè)自定義工具,當(dāng)點(diǎn)擊自定義工具時(shí),彈出提示信息。
define([
'base/js/namespace'
], function(
Jupyter
) {
function load_ipython_extension() {
var handler = function () {
alert('歡迎使用前端擴(kuò)展!');
};
var action = {
icon: 'fa-comment-o',
help : '前端擴(kuò)展',
help_index : 'zz',
handler : handler
};
var prefix = 'my_extension';
var action_name = 'show-alert';
var full_action_name = Jupyter.actions.register(action, action_name, prefix); // returns 'my_extension:show-alert'
Jupyter.toolbar.add_buttons_group([full_action_name]);
}
return {
load_ipython_extension: load_ipython_extension
};
});
完前端擴(kuò)展代碼后,我們把腳本保存到main.js文件,放置在/opt/my_extension目錄下。接下來(lái)我們使用jupyter nbextension工具來(lái)安裝和啟用前端擴(kuò)展
# 安裝前端擴(kuò)展
jupyter nbextension install /opt/my_extension
# 啟用前端擴(kuò)展
jupyter nbextension enable my_extension/main
# 禁用前端擴(kuò)展
jupyter nbextension disable my_extension/main
# 查看前端擴(kuò)展列表
jupyter nbextension list
# 卸載前端擴(kuò)展
jupyter nbextension uninstall my_extension
圖9 在Notebook工具條中加入的前端擴(kuò)展
7.2. 服務(wù)端擴(kuò)展
Jupyter服務(wù)端擴(kuò)展(server extension)是使用Python語(yǔ)言編寫(xiě)的模塊,可以用來(lái)處理發(fā)送到Jupyter Server的Http請(qǐng)求。使用Jupyter服務(wù)端擴(kuò)展,可以更改現(xiàn)有Jupyter請(qǐng)求的數(shù)據(jù)和行為,也可以為jupyter Server定義新的服務(wù)處理程序。
定義一個(gè)服務(wù)端擴(kuò)展模塊要實(shí)現(xiàn)一個(gè)load_jupyter_server_extension方法,其中包含一個(gè)類(lèi)型為notebook.notebookapp.NotebookApp的參數(shù)serverapp,serverapp的詳細(xì)屬性和方法可以通過(guò)Jupyter Notebook源代碼中的notebookapp.py文件來(lái)查看。當(dāng)服務(wù)端擴(kuò)展被加載時(shí),Jupyter Server會(huì)調(diào)用load_jupyter_server_extension方法。在load_jupyter_server_extension方法中,我們可以通過(guò)調(diào)用serverapp的web_app屬性的add_handlers方法來(lái)注冊(cè)處理程序,用來(lái)處理特定的服務(wù)端請(qǐng)求。處理程序類(lèi)需要繼承自Jupyter的IPythonHandler類(lèi)。在處理程序的方法中,可以使用Jupyter提供的@web.authenticated裝飾器來(lái)為方法增加身份認(rèn)證保護(hù)。
通過(guò)服務(wù)端擴(kuò)展,還可以與前端擴(kuò)展聯(lián)動(dòng),實(shí)現(xiàn)一個(gè)功能豐富的Jupyter Notebook前端控件。
# 定義一個(gè)處理程序
from tornado import (
gen, web,
from notebook.base.handlers import IPythonHandler
class HelloWorldHandler(IPythonHandler):
@web.authenticated
@gen.coroutine
def get(self):
self.finish(f'Hello, world!')
# 實(shí)現(xiàn)load_jupyter_server_extension方法并注冊(cè)處理程序
def load_jupyter_server_extension(serverapp):
handlers = [
('/myextension/hello', HelloWorldHandler)
]
serverapp.web_app.add_handlers('.*$', handlers)
完成服務(wù)端擴(kuò)展代碼后,我們把代碼保存為_(kāi)_init__.py文件,要在Jupyter Notebook中使用處理程序,我們還需要進(jìn)行服務(wù)端擴(kuò)展的安裝和啟用。不同于前端擴(kuò)展,服務(wù)端擴(kuò)展不能直接使用指令來(lái)安裝,需要我們手動(dòng)編寫(xiě)安裝程序。此外,Jupyter提供了自動(dòng)啟用服務(wù)端擴(kuò)展和前端擴(kuò)展的方法,需要我們?cè)谀_本的根目錄提供啟用擴(kuò)展的配置文件。
jupyter-config/
├── jupyter_notebook_config.d/
│ └── my_server_extension.json
└── nbconfig/
└── notebook.d/
└── my_front_extension.json
setup.py
加入了自動(dòng)啟用擴(kuò)展的配置,我們的服務(wù)端擴(kuò)展目錄結(jié)構(gòu)如下:
hello-extension/
├── __init__.py
jupyter-config/
├── jupyter_notebook_config.d/
└── hello_extension.json
hello_extension.json文件的內(nèi)容為:
{
"ServerApp": {
"jpserver_extensions": {
"hello_extension": true
}
}
}
接下來(lái)我們通過(guò)安裝程序,安裝服務(wù)端擴(kuò)展的信息保存在/root/.jupyter/jupyter_notebook_config.json文件中。在安裝完成后,我們可以通過(guò)jupyter serverextesion工具來(lái)股那里服務(wù)端擴(kuò)展
# 啟用服務(wù)端擴(kuò)展
jupyter serverextension enable hello_extension
# 禁用服務(wù)端擴(kuò)展
jupyter serverextension disable hello_extension
# 服務(wù)端擴(kuò)展直接卸載的方法,需要我們通過(guò)pip uninstall 卸載安裝程序,
# 再通過(guò)手工修改/root/.jupyter/jupyter_notebook_config.json文件刪除擴(kuò)展信息來(lái)完成卸載
圖10 在瀏覽器中測(cè)試安裝的服務(wù)端擴(kuò)展程序
7.3. 界面定制
Jupyter沒(méi)有提供標(biāo)準(zhǔn)的界面定制的能力,但我們可以手工調(diào)整jupyter生成的模板視圖文件和樣式文件,達(dá)到整條調(diào)整jupyter notebook的界面的能力。
Jupyter Notebook模板文件的位置為:$notebook/templates,樣式和腳本定制推薦的方案是使用~/.jupyter/custom/custom.css和~/.jupyter/custom/custom.js文件。我們可以直接在此基礎(chǔ)上對(duì)文件進(jìn)行修改,還可以通過(guò)extra_template_paths和extra_static_paths來(lái)引入其它位置的模板和其它靜態(tài)文件。
圖11 通過(guò)直接調(diào)整模板文件加入的界面定制按鈕
7.4. 小部件
小部件(Widgets)是Jupyter交互式可視化數(shù)據(jù)呈現(xiàn)部件。Jupyter Widgets同時(shí)包含了訪問(wèn)后端數(shù)據(jù)和前端呈現(xiàn)的能力,可以用于在Jupyter Notebook上生動(dòng)地展示服務(wù)端的數(shù)據(jù)和數(shù)據(jù)變化。
在v6.5.2穩(wěn)定版本上,我們目前只能使用系統(tǒng)提供的小部件,還不能開(kāi)發(fā)自定義小部件。在Jupyter notebook7.x版本中,開(kāi)始提供了小部件的自定義開(kāi)發(fā)能力。
# 確保安裝了ipywidgets和traitlets
pip install --upgrade traitlets
pip install --upgrade ipywidgets
# 安裝和啟用小部件
jupyter nbextension install --py widgetsnbextension
jupyter nbextension enable --py widgetsnbextension
在安裝和啟用了小部件后,我們可以在notebook中直接使用系統(tǒng)提供的小部件。
圖12 在Notebook中使用小部件
完整的小部件列表和使用方式可以參考: https://ipywidgets.readthedocs.io/en/7.x/examples/Widget%20List.html
8. 總結(jié)
Jupyter Notebook以其豐富的功能,簡(jiǎn)單易用,強(qiáng)大的交互能力和擴(kuò)展能力,成為數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)開(kāi)發(fā)中的神器。目前,Jupyter Notebook支持超過(guò)40種編程語(yǔ)言,被應(yīng)用于Google Colab, Kubeflow, 華為云,kaggle等多個(gè)知名項(xiàng)目中,大量機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)的論文中使用到了Jupyter。Jupyter在數(shù)據(jù)可視化,提升工作效率,改善用戶體驗(yàn)和豐富文檔功能方面顯現(xiàn)了巨大的威力。除此之外,Jupyter還提供的靈活強(qiáng)大的擴(kuò)展能力,更是為Jupyter的深層次使用提供了更廣闊的想象空間。如果你還沒(méi)有開(kāi)始接觸Jupyter,那么就從現(xiàn)在開(kāi)始吧。
掃描二維碼推送至手機(jī)訪問(wèn)。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處。