一、环境:
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