Windows下安裝Jupyter,做爲後臺服務運行

原文發表於個人博客 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_,或者把配置文件複製到指定的目錄裏便可。

相關文章
相關標籤/搜索