jupyter作为window服务

两盒软妹~` 提交于 2019-11-30 17:59:14

一、环境:

win10_64位,python3.7.3

二、目录结构:

V:\MY_WORK\JUPYTER
│  jupyter_service_v2.py
│  start_jupyter.cmd
├─config
│      jupyter_notebook_config.py
├─files
│  │  0001_hello_world.ipynb
│  │  流畅的python.ipynb
└─logs
        my_notebook.log

三、jupyter_service_v2.py内容:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
用法:
lib/site-packages/win32/PythonService.exe -debug MyJupyterService
python jupyter_service_v2.py --startup=auto install
python jupyter_service_v2.py install
python jupyter_service_v2.py start
python jupyter_service_v2.py remove
"""
import inspect
import logging
import os
import sys
import win32serviceutil
import win32event
import win32service
from notebook.notebookapp import NotebookApp

# 作为服务运行时的工作目录是system32,这里改为文件所在目录
current_file = os.path.abspath(inspect.getfile(inspect.currentframe()))
os.chdir(os.path.dirname(current_file))


class MyJupyterService(win32serviceutil.ServiceFramework):
    _svc_name_ = "MyJupyterService"  # 服务名
    _svc_display_name_ = "My Jupyter Service"  # job在windows services上显示的名字
    _svc_description_ = "本机Jupyter的服务"  # job的描述

    def __init__(self, args):
        if args:
            super().__init__(args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        self.run = True
        self.app = None
        self.logger = self._get_logger()
        self.app = NotebookApp()
        self.logger.info("NotebookApp() ok")
        if self.logger:
            self.logger.info("%s.__init__ ok" % __class__.__name__)

    def _init_notebook(self):
        # self.logger = self._get_logger()
        self.app.config_dir = r"V:\my_work\jupyter\config"  # 设置配置文件目录
        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()
        self.logger.info("%s._init_notebook ok" % __class__.__name__)


    @staticmethod
    def _get_logger():
        """日志记录"""
        this_file = inspect.getfile(inspect.currentframe())
        dir_path = os.path.abspath(os.path.dirname(this_file))
        log_path = os.path.join(dir_path, "logs")
        if os.path.exists(log_path):  # 创建log文件夹
            pass
        else:
            os.mkdir(log_path)

        logger = logging.getLogger("NotebookApp")
        logger.setLevel(logging.DEBUG)
        for handler in logger.handlers:
            if handler.name == "my_notebook.log":
                break
        else:
            handler = logging.FileHandler(os.path.join(log_path, "my_notebook.log"))
            handler.set_name("my_notebook.log")
            formatter = logging.Formatter('%(asctime)s|%(name)-12s|%(levelname)-8s|%(message)s')
            handler.setFormatter(formatter)
            handler.setLevel(logging.DEBUG)
            logger.addHandler(handler)
        logger.info("%s._getLogger ok" % __class__.__name__)
        return logger

    def SvcDoRun(self):
        self._init_notebook()
        self.app.start()

    def SvcStop(self):
        self.logger.info("service is stop....")
        self.app.stop()
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        self.run = False

    def SvcShutdown(self):
        self.SvcStop()


if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(MyJupyterService)

四、命令说明:

# 调试服务
python-install-path\lib\site-packages\win32\PythonService.exe -debug MyJupyterService
# 安装服务
python jupyter_service_v2.py --startup=auto install
# 启动服务
python jupyter_service_v2.py start
# 停止服务
python jupyter_service_v2.py stop
# 卸载服务
python jupyter_service_v2.py remove

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!