原文發表於個人博客 https://blog.kaciras.net/article/38html
隨着AI的大潮,Python大火大熱,學了Py,那就是學了寫人工智能的語言,而人工智能著名競賽Kaggle欽定的在線筆記本:Jupyter可謂是每一個AI開發者必備的工具了。用了Jupyter,你才進入了AI的行業;用了Jupyter,你才能與國際賽事接軌;用了Jupyter,你才能寫吳恩達的在線做業!(這段請勿當真)python
你是否是馬上就想裝上它了?web
pip install jupyter jupyter notebook
OK!是否是很簡單?固然你要是裝的Anaconda,那就更簡單了,直接自帶,啓動便可。什麼你連Python都沒裝?shell
好的如今它已經運行起來了,但若是你用的是Windows,或者你準備把它放到Windows系統的服務器上,那還有點特別小的問題。Jupyter通常都是做爲後臺服務運行,以便隨時使用,若是你在本身的家用機上運行,它要佔一個任務欄格子,並且還要一直打開一個難看的黑框框命令行界面,有時候一不當心就點到它。這是很煩人的,一個合格的筆記本應該學聰明點,在我想用的時候纔出來,其餘時間呆在後臺睡大覺就好。windows
而在Windows系統的服務器上運行Jupyter,也有個小問題,你們都知道,想在Windows上活得持久,那就得當個服務,否則一登出全部的用戶進程所有都會停掉,並且萬一服務器他本身忽然不舒服,想重啓一下(好比最新版Windows的自動更新),還得讓咱們的Jupyter也隨系統啓動(不是隨用戶登陸啓動哦)。bash
想一想其餘的第三方服務,什麼Tomcat啊,裝完直接給你塞個Windows服務,那叫一個方便,你Jupyter是看不起我Windows?,既然它不支持,那還得本身來支持。服務器
Google了一會,沒找到怎麼讓它當個服務的方法,卻是看到個偏方,那就是用任務計劃程序:(網址見這裏 Directions For Running Jupyter In The Background On Windows)。不過我不喜歡這種方式,明明人家微軟給準備了個服務功能專門幹這事,用任務計劃幹嗎。app
......一小時後webapp
在研究了一番Jupyter的源碼以後,寫出了用代碼啓動和中止它的方法,再配合Pywin32,成功地把它搞成了一個服務!好的不瞎扯了,首先你須要安裝Pywin32(這個Anaconda也沒帶):ide
pip install pywin32 python Scripts/pywin32_postinstall.py -install
一樣是兩條命令搞定,想當年Pywin32還得下安裝包,如今它也終於敵不過歷史的進程,從過氣的Sourceforge搬到了Github,從安裝包安裝變成了pip安裝。
萬事具有,有請啓動腳本登場!!!
import inspect import logging import os import win32serviceutil from notebook.notebookapp import NotebookApp, JupyterApp # 做爲服務運行時的工做目錄是system32,這裏改成文件所在目錄 current_file = os.path.abspath(inspect.getfile(inspect.currentframe())) os.chdir(os.path.dirname(current_file)) class NotebookService(win32serviceutil.ServiceFramework): _svc_name_ = "JupyterNotebook" _svc_display_name_ = "Jupyter Notebook Service" _svc_description_ = "Jupyter的服務啦" def __init__(self, args): super().__init__(args) self.app = NotebookApp() def _init_notebook(self): JupyterApp.initialize(self.app) self.app.init_configurables() self.app.init_components() self.app.init_webapp() self.app.init_terminals() self.app.init_server_extensions() self.app.init_mime_overrides() self.app.init_shutdown_no_activity() def SvcDoRun(self): self.app.config_dir = "config" # 設置配置文件目錄 self._init_notebook() logging.getLogger("NotebookApp").addHandler(logging.FileHandler("notebook.log")) self.app.start() def SvcStop(self): self.app.stop() def SvcShutdown(self): self.SvcStop() if __name__ == '__main__': win32serviceutil.HandleCommandLine(NotebookService)
OK!是否是很簡單?帶註釋50行不到,你能夠直接新建一個py文件,好比叫winservice.py,而後把它粘貼進去保存,再以管理員權限運行python winservice.py install --startup=auto
,以後打開服務就能看到它已經進去了(默認服務名 Jupyter Notebook Service)。
若是在服務器上運行,並由公網訪問,那是須要配置一下的,好比設密碼啊、改端口啊,具體能夠直接百度或谷歌一大堆教程,這裏就不說了。
修改了配置文件後就有個小問題,那就是默認安裝的服務是以系統帳戶運行的,你要是在用戶目錄保存了Jupyter的配置文件,它是找不到的。一種解決方法是在服務面板裏修改登陸身份爲你的帳戶,或者在安裝服務時加上參數python winservice.py install --startup=auto --username=xxx --password=xxx
。
還有一種方法就是自定義配置文件位置,看到代碼裏那個_設置配置文件目錄_ 的註釋了沒,把前面的字符串改爲配置文件所在的目錄,好比_C:\Users\Administor\.jupyter_,或者把配置文件複製到指定的目錄裏便可。